Hallo just me!
Zwischen dem Progress liegt - bzw. soll liegen - das Umbenennungsmodul. Oder genauer: Es handelt sich ja um zwei Routinen, eine für Signaturen mit oder ohne Index. Das Progress wird jeweils nach der Verzweigung eingesetzt, denn dort beginnt ja erst der eigentliche Umbenennungsvorgang.
So sieht der Code aus:
Code: Select all
<!LButton::
; Explorerfenster bestimmen
ExplorerID := WinExist()
ShellWin := 0
For Win In ShellApp.Windows {
If (Win.HWND = ExplorerID) {
ShellWin := Win
Break
}
}
If !(ShellWin) ; das aktive Explorerfenster wurde nicht gefunden, Abbruch!
Return
; Auswahl nach unten erweitern
Send, +{LButton}
; Auswahl einlesen und bereinigen. Die erste Datei (mit dem Fokus) kommt ans Ende.
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selecteditems
If !(ShellWin.Document.SelectedItems.Count > 0) { ; keine Auswahl
MsgBox, Sie müssen mindestens eine Datei markieren!
Return
}
SelectedItems := []
For Item In ShellWin.Document.SelectedItems
SelectedItems.Push(Item)
LetzteDatei := SelectedItems.RemoveAt(1) ; erste (bzw. letzte) Datei aus dem Array entfernen ...
SelectedItems.Push(LetzteDatei) ; ... und wieder anhängen
Anzahl := SelectedItems.Length()
; Prüfen, ob die Dateinamenserweiterungen angezeigt werden
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-viewoptions
ShowExt := (ShellWin.Document.ViewOptions & 2) ; SFVVO_SHOWEXTENSIONS (0x00000002)
; MsgBox, 0, ShowExt, %ShowExt%
If (StellenIndex = "0") ; fragt, ob Index vorhanden und wählt die Routine aus
Gosub, OhneIndex
Else
Gosub, MitIndex
return
MitIndex: ; zum Umbenennen, wenn Index vorhanden
; Benutzereingaben zum Umbenennen holen
LetzteSign := Format("{:0" . StellenSign . "}", ++LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
InputBox, BoxSign, Vorschau, Es werden %Anzahl% Bilder umsigniert, , 225, 125, , , , ,%LetzteSign%
If (ErrorLevel) {
LetzteSign--
Return
}
Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
LetzteSign := Format("{:0" . StellenSign . "}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
LetzterIndex := 0 ; Setzt Index auf 0
}
Else {
StringSplit, BoxArray, BoxSign, `,
If (BoxArray1 = "")
LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
Else
LetzteSign := Format("{:0" . StellenSign . "}", BoxArray1) ; Setzt neue Signatur auf 4 Ziffern
LetzterIndex := BoxArray2
}
; Dateien umbenennen
ShellWin.Document.SelectItem(SelectedItems[1], 4)
For Index, Item In SelectedItems {
ItemPath := Item.Path
SplitPath, ItemPath, DateiName, , Erweiterung
LetzterIndex := Format("{:0" . StellenIndex . "}", LetzterIndex) ; Setzt Index auf 1 in 2 Ziffern
Item.Name := AktSign . "_" . LetzteSign . "-" . LetzterIndex . (ShowExt ? "." . Erweiterung : "")
LetzterIndex++
}
; Fertig
; Letzte Datei selektieren
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
For Index, Item In SelectedItems
Item := ""
ShellWin := ""
Progress, Off
Return
OhneIndex: ; zum Umbenennen, wenn kein Index vorhanden
; Benutzereingaben zum Umbenennen holen
If (LetzteSign = 0)
LetzteSign := Format("{:0" . StellenSign . "}", 1)
else
LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign)
InputBox, BoxSign, Vorschau, Es werden %Anzahl% Bilder umsigniert, , 225, 125, , , , ,%LetzteSign%
If (ErrorLevel) {
LetzteSign--
Return
}
Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
If !InStr(BoxSign, ",") { ; Prüft, ob ein anderer Startindex durch Komma getrennt eingegeben wurde
LetzteSign := Format("{:0" . StellenSign . "}", BoxSign) ; Setzt neue Signatur auf 4 Ziffern
LetzterIndex := 0 ; Setzt Index auf 0
}
Else {
StringSplit, BoxArray, BoxSign, `,
If (BoxArray1 = "")
LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign) ; Erhöht die letzte Signatur um 1 und setzt sie auf 4 Ziffern
Else
LetzteSign := Format("{:0" . StellenSign . "}", BoxArray1) ; Setzt neue Signatur auf 4 Ziffern
LetzterIndex := BoxArray2
}
; Dateien umbenennen
ShellWin.Document.SelectItem(SelectedItems[1], 4)
For Sign, Item In SelectedItems {
ItemPath := Item.Path
SplitPath, ItemPath, DateiName, , Erweiterung
LetzteSign := Format("{:0" . StellenSign . "}", LetzteSign) ; Setzt Index auf 1 in 2 Ziffern
Item.Name := AktSign . "_" . LetzteSign . (ShowExt ? "." . Erweiterung : "")
LetzteSign++
}
; Fertig
; Letzte Datei selektieren
; -> docs.microsoft.com/en-us/windows/desktop/shell/shellfolderview-selectitem
ShellWin.Document.SelectItem(SelectedItems[Anzahl], 29)
For Sign, Item In SelectedItems
Item := ""
ShellWin := ""
Progress, Off
return
Vielleicht sitzen die Befehle lediglich in der falschen Zeile.
Zu dem Auswahlfenster. Du sagst:
Wenn aus einer duch einen Hotkey ausgelösten Routine eine Fehlermeldung kommt, ist es doch recht 'normal', dass man diesen Hotkey nach Fehlerbereiningung noch einmal eingeben muss.
Das ist im Prinzip schon richtig, aber auch nur, wenn man voraussetzt, daß es sich um einen Fehler handelt. Die Auswahl ist ja nicht primär dafür da, vergessene Eingaben nachzuholen. Vor der Eingabe von
F12 wird man ja nicht darauf hingewiesen. Außerdem bleibt die
AktSign ja auch gespeichert, wenn ich zuvor mit einem anderen Modul gearbeitet hatte. Das muß aber nicht diejenige sein, die in diesem Fall verwendet werden soll. darum werde ich wohl noch eine weitere
MsgBox einbauen oder mit der
InputBox in eine
Gui legen, die die aktuelle
AktSign anzeigt und fragt, ob man sie ändern will. Eigentlich - das fällt mir gerade jetzt erst ein - bräuchte man dafür nur eine solche Gui, in die man den Hinweistext je nach Ergebnis der Abfrage hineinsetzt. Mal sehen, ob ich da noch was entwerfe. Vorerst aber eher nicht.
Aber grundsätzlich bleibt die Frage: Wie kann ich mit AHK Subroutinen schreiben, die ich im laufenden Script aufrufen und abarbeiten kann und die anschließend wieder an dieselbe Stelle in das Script zurückkehren und dieses dort fortsetzen?
Zuletzt noch einmal meine letzte Frage zu der Trimmen-Funktion über
^F6
Du schriebst:
Mein Code prüft, ob der Anfang des Dateinamens mit dem vorgegebenen Bestandsnamen übereinstimmt. Wenn nicht, wandert die Datei in das Fehlerarray.
Wie ich es verstanden habe, können die Bestandsnamen auch die für die Abtrennung von Signatur und Index genutzten Trennzeichen enthalten. Wie willst Du ermitteln, wo genau ein 'falscher' Bestandsname endet?
meine Antwort und Frage dazu war:
Wenn es dann eine Möglichkeit gibt, dieses Fehlerarray nach dem Ablauf des eigentlichen Scripts noch einmal in einem separaten Fenster o.ä. zu öfnen, um diese übriggebliebenen Dateien dann manuell zu korrigieren, dann wäre das schon in Ordnung. Man muß eben bedenken, daß man diese bei größeren Beständen sonst mühsam wieder zusammensuchen müßte.
Nochmal also: Ist es möglich, dieses Array so zu erhalten, daß man sich danach die einzelnen Dateien zum manuellen Umbenennen/Korrigieren vornehmen kann? oder daß sie alle zu diesem Zweck in einen separaten (Unter-)Ordner verschoben werden?
Viele Grüße von Meister Lampe