Optimierung Umbenennungstool

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

20 Jun 2019, 02:24

Moin,
Das Script, das Du mir im letzten Post geschickt hast, arbeitet noch nicht so wie gewünscht. Es wird lediglich die erste Datei geprüft und ggf. korrigiert, alle weiteren werden dann im der Liste "Umbenennen?" eingesammelt und angezeigt ...
Das Skript, das ich gepostet habe, soll lediglich die eingelesenen Dateien filtern. Die, die nicht zu dem vorgegebenen Namensschema passen, sollen in das Array Namensfehler gestellt und angezeigt werden. Alle anderen Dateinamen sollen im Array Umbennen landen. Das wird am Ende mit folgender For Schleife abgearbeitet:

Code: Select all

   For Each, Datei In Umbenennen
   {
      ; FileMove, % Datei["Alt"], Datei["Neu"]
      MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
   }
Wenn da tatsächlich umbenannt werden soll, musst Du das Semikolon vor der FileMove Anweisung entfernen (und ggf. die MsgBox Anweisung entfernen/auskommentieren). Es kann z.Zt. allerdings passieren, dass der alte und der neue Name identisch sind. Das könnte in der For Schleife abgefangen werden.

Ich kann übrigens nicht erkennen, wo in der aktuellen ^F6 Routine auch nur eine einzige Datei umbenannt wird.

Grüße, just me
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

04 Jul 2019, 17:21

Hallo just me!

Ich habe jetzt in der Praxis im Archiv das erste Modul (Umbenennen/Neusignieren über Alt+LButton) mehrfach erfolgreich testen können. Ich grüble nur noch daran, wieso das Progressfenster, das ein animiertes Wartesymbol ersetzen soll, lediglich kurz angezeigt wird und wenn es viele Dateien sind nicht bis zum Abschluß des Vorgangs sichtbar bleibt, obwohl ich den Befehl Progress, Off ans Ende des Scripts gesetzt habe.

Code: Select all

Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
...
Progress, Off
return
Zu Punkt 5.) aus meinem letzten Post:
Ich habe die Abfrage nach abweichender Stellenlänge jetzt auch auf sich nicht deckende Bestandsnamen erweitert:

Code: Select all

; statt:
If !(StrLen(Match1) = SignStellen)
; jetzt
If (StrLen(Match1) <> SignStellen or NameArray[1] <> AktSign)
Damit scheint es zu klappen. Es genügt jetzt ein Unterstrich vor der Ziffernkette, um diese als die Signatur zu erkennen.
Ich wüßte gerne, ob man das auch ganz ohne machen könnte, so wie ich in Punkt 6.) beschrieben habe.
Schließlich:
In Deinem letzten Script gibt es ja nur eine FileMove-Schleife. D.h., daß ich dort bei Datei["Neu"] bei unter den im Array Umbenennen gesammelten Dateien vorher wieder unterscheiden muß zwischen denen mit und einen ohne Index. Habe ich das richtig gesehen?

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

19 Jul 2019, 17:03

Hallo just me!
In Deinem letzten Script gibt es ja nur eine FileMove-Schleife. D.h., daß ich dort bei Datei["Neu"] bei unter den im Array Umbenennen gesammelten Dateien vorher wieder unterscheiden muß zwischen denen mit und einen ohne Index. Habe ich das richtig gesehen?
Habe ich natürlich nicht. ich hatte nicht gesehen, daß die Erstellung der Namen zu diesem Zeitpunkt eigentlich schon vollzogen ist, es werden ja in der Vorschau alle schon zugeordnet und bereitgestellt. Mit dem FileMove findet wohl lediglich deren Vergabe statt.
Ich habe die MsgBox jetzt auskommentiert und die Schleife aktiviert. Trotzdem klappt es noch nicht wie gewünscht - weder bei den Signaturen mit noch bei denen ohne Index.
Und wenn ich das einrichten will, wie ich es beireits bei dem ersten Script (F6) gemacht habe und den vorangestellten Bestandsnamen AktSign gleich aus der Vorlage entnehme und im Dateinamen einsetze, dann müßten ja wohl die Kontrollfragen bzw. die Aufsplittung des Dateinamens in Deinem Script etwas geändert werden. Ein wenig rumprobiert habe ich da zwar auch schon, aber da das Original noch nicht richtig geklappt hat, habe ich das schnell aufgegeben.

Viele Grüße, Bernhard
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

20 Jul 2019, 05:16

Moin Meister,

ich würde Dir ja gern helfen, ich verstehe aber wieder einmal nicht, wo Du hinwillst. Meine letzten Codeschnipsel sind keine eierlegende Wollmilchsau. Sie sind der Versuch einer Umsetzung Deines Vorschlags, dass das Skript anhand der vorgegebenen Indexstellen automatisch zwischen Dateien mit und ohne Index unterscheiden soll. Bei Vorgabe von Indexstellen = 0 wird bei den markierten Dateien lediglich auf eine vorhandene Signatur geprüft. Die wird ggf. korrigiert und alles, was auf die vorhandene Signatur folgt, wird blind angehängt. Bei Indexstellen <> 0 wird außerdem geprüft, ob der SIgnatur ein Index folgt und dieser ggf. korrigiert. Als ich das geschrieben habe, war von Dateien ohne gültiges AktSign nicht die Rede. Wenn wir weiter Zusammenarbeiten wollen, müssen wir gleichzeitig in dieselbe Richtung gehen, d.h., schrittweise ein Problem lösen, bevor eine neue Baustelle aufgemacht wird. Für die Lösung brauche ich konkrete Beispiele von Dir, welche getesteten Dateinamen auf welche Weise falsch verarbeitet werden (Input -> Output).

Grüße, just me
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

22 Jul 2019, 16:24

Hallo just me!
Sie sind der Versuch einer Umsetzung Deines Vorschlags, dass das Skript anhand der vorgegebenen Indexstellen automatisch zwischen Dateien mit und ohne Index unterscheiden soll.
Ja, das habe ich schon begriffen und in der MsgBox werden die alten/neuen Namen ja auch sehr schön aufgeführt. Nur die Umbenennung durch das FileMove klappt eben noch nicht.
Und deshalb habe ich erstmal an dem bereits (zumindest für die Namen ohne Index) funktionierenden Script experimentiert, u.a. weil mir auch schon eine Weile zwei Gedanken durch den Kopf gingen:
1.) Ich wähle für das Trimmen zwar eine Vorlage aus, aber der Bestandsname spielt dabei keine Rolle. Wenn ich an einem Bestand mit Namen A 565--4 arbeite, die Signatur 4 Stellen und der Index 3 Stellen haben soll, dann könnte ich statt A 565--4 | 0001 | 000 genausogut die Vorlage K 67 | 0001 | 000 auswählen, und würde dasselbe Ergebnis erhalten. Das erschien mir verwirrend und sinnlos.
2.) Was ist, wenn der Bestandsname nicht richtig geschrieben wurde? Warum nicht gleich ganz überschreiben bzw. durch den mit der Vorlage gewählten ersetzen? Damit reicht es, beim Aufsplitten des Dateinamens den vorderen Teil zu verwerfen, um nachher die aktuelle AktSign anzufügen.
Das ist mir ja auch für das Script ohne Index ganz gut gelungen.
Zur Ansicht der Code daraus:

Code: Select all

F6::
   Clipboard := ""
   SendInput, ^c
   Clipwait, 1
 
   DateienAuslese := Clipboard
   SignStellen := StellenSign
   IndexStellen := StellenIndex
   NewAktname := AktSign
   If !(StellenIndex = "0")
   {
      ;Gosub, Trimmen_mI
      MsgBox, 16, Fehler!,  Sie können keine Signaturen nach Vorlagen mit Indizes prüfen!
      return
   }
   else
   Loop, Parse, Dateienauslese, `n, `r
   {
      SplitPath, A_LoopField, , Verzeichnis, Erweiterung, AlterName
      NameArray := StrSplit(AlterName, "_")
      
       ; Wenn NameArray[2] mit einer oder mehreren Ziffer(n) beginnt und mit einer oder keiner 'Nichtziffer' endet ...
      If RegExMatch(NameArray[2], "^(\d+)(\D?)$", Match)
      {
         ; MsgBox, % StrLen(Match1) . ": " . Match1 . "   <>   " . Match2
         If (StrLen(Match1) <> SignStellen or NameArray[1] <> AktSign)
         {
            Match1 += 0 ; führende Nullen entfernen
            If !(StrLen(Match1) > SignStellen)
            {
               NewSign := Format("{:0" . SignStellen . "}", Match1) . Match2
               ; MsgBox, % StrLen(NewSign) . ": " . NewSign . "   <>   " . Match2
               FileMove, %A_LoopField%, %Verzeichnis%\%NewAktname%_%NewSign%.%Erweiterung%
            }
         }
      }      	
   }  
return
Ich hatte versucht, das auch in Deinen Vorschlag einzubauen, aber schnell davon abgelassen, weil ich keine Möglichkeit zur Kontrolle hatte.
Aber im Prinzip bin ich schon mit Dir einer Meinung, daß man die Schritte schön hintereinander machen sollte.
Für die Lösung brauche ich konkrete Beispiele von Dir, welche getesteten Dateinamen auf welche Weise falsch verarbeitet werden (Input -> Output).
Kann ich hier einen Screenshot o.ä. einfügen mit der Ansicht der MsgBox, in der die alten und neuen Dateinamen dann aufgelistet sind?
Ich glaube, so könnte das am besten gehen.

Viele Grüße von Bernhard
Last edited by Meister Lampe on 13 Aug 2019, 16:47, edited 1 time in total.
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

23 Jul 2019, 05:27

Hallo,

Du brauchst von MsgBoxen kein Bildschirmfoto zu machen. Du kannst bei aktivem MsgBox-Fenster mit Strg+c den Inhalt als Text in einen beliebigen Editor oder direkt in Deinen Beitrag kopieren.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

06 Aug 2019, 17:05

Hallo just me!

Hier kommt jetzt einmal eine konkrete Auswertung.
Zuerst 10 Beispiele ohne Index, die die meisten Fälle abdecken dürften:

Code: Select all

W 134_0.tif			(nur eine Null, die aber als Nummer gilt)
W 134_000006a.tif			(korrekt, mit Buchstabe hinten)
W 134_000012.tif			(korrekt, ohne Buchstabe hinten)
W 134_0035s.tif				(zu wenig Zeichen, mit Buchstabe hinten)
W 134_933.tif				(zu wenig Zeichen, ohne Buchstabe hinten, keine Null am Anfang)
W 134_07924.tif			(zu wenig Zeichen, ohne Buchstabe hinten)
W 134_07934-.tif			(zu wenig Zeichen, mit Sonderzeichen hinten)
W 134_00007935.tif			(zu viele Nullen vorne, ohne Buchstabe hinten)
W 134_000070933B.tif		(zu viele Nullen vorne, mit Buchstabe hinten)
W 134_1000001.tif			(zu viele Zeichen, keine Null vorne)
Ich arbeite jetzt mit Deinem Script und habe erstmal in der Umbennen-Schleife das FileMove deaktiviert:

Code: Select all

 For Each, Datei In Umbenennen
   {
      ;FileMove, % Datei["Alt"], Datei["Neu"]
      MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
   }
Ich habe über F8 die Vorlage W 134 | 000000 | - eingerichtet und ausgewählt.
Nach dem Markieren der Dateien und ^F6 meldet sich zuerst eine MsgBox:
---------------------------
Fehler!
---------------------------
Folgende Dateinamen können nicht korrigiert werden:
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Beispielbilder Pragher\Problemfälle\W 134_1000001.tif
Sollen 9 dennoch umbenannt werden?
---------------------------
Ja Nein
Daß das Programm damit nicht zurecht kommt, war ja vorauszusehen.
Nach dem Bestätigungsklick auf "Ja" erscheint für jede der weiteren Dateien eine MsgBox wie diese hier:
---------------------------
Umbenennen!
---------------------------
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Beispielbilder Pragher\Problemfälle\W 134_0 .tif
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Beispielbilder Pragher\Problemfälle\W 134_000000 .tif
---------------------------
OK
Darin werden die richtig(!) korrigierten Dateinamen schön brav in einer Vorschau mit den Originalen verglichen, auch diejenigen, bei denen ein Umbenennen nicht nötig wäre.

Wenn ich jetzt umgekehrt die MsgBox auskommentiere und das FileMove aktiviere:

Code: Select all

 For Each, Datei In Umbenennen
   {
      FileMove, % Datei["Alt"], Datei["Neu"]
      ;MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
   }
dann kommt erstmal wieder dieselbe Fehlermeldung ("..können nichtg korrigiert werden..") wie oben.
Nach dem Bestätigen mit "Ja" schließt sich das Fenster wieder, aber dann tut sich auch nichts mehr. Korrekturen oder sonstige Veränderungen der Dateinamen werden nicht unternommen.
Schließlich habe ich einmal, um das besser nachvollziehen zu können, im Code die MsgBox vor das FileMove gesetzt und beide aktiviert:

Code: Select all

 For Each, Datei In Umbenennen
   {
      MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
      FileMove, % Datei["Alt"], Datei["Neu"]
   }
Es werden auch hier alle Dateien durchgegangen und in der Vorschau angezeigt, aber nichts umbenannt.

Soweit für heute. Ich werde analoge Tests, also was das korrekte Umbenennen betrifft, morgen an Namen mit Indizes ausführen und Dir davon berichten.

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

08 Aug 2019, 17:04

Hallo just me!

Hier auch die Ergebnisse des Tests von Dateinamen mit Index:
Dabei gilt die Vorlage B 123--4 | 000 | 0000 .
12 Beispiele habe ich ausgesucht.

Code: Select all

B 123--4_001-0002.bmp			(korrekt nach Vorlage)
B 123--4_006-10030.bmp			(Index zu viele Zeichen, aber keine Null vorne)
B 123--4_014-0002ab.bmp			(Index mit 2 Buchstaben, sollte toleriert werden)
B 123--4_014-03.bmp				(Index zu kurz)		
B 123--4_017-00006.bmp			(Index zu lang)
B 123--4_17-07.bmp				(Signatur u. Index zu kurz)
B 123--4_00018-0001.bmp			(Signatur zu lang)
B 123--4_019c-0000.bmp			(Signatur mit Buchstabe, Index zu lang)
B 123--4_000045-0000024.bmp		(Signatur u. Index zu lang)
B 123--4_045-022d.bmp			(Index mit Buchstabe, aber zu kurz)
B 123--4_256-7525.bmp			(korrekt, aber ohne Nullen vorne)
B 123--4_4000-0000.bmp			(Signatur zu viele Zeichen, aber keine Null vorne)
Ich habe zum besseren Nachvollziehen des Vorgangs erstmal wieder nur die MsgBox und nicht das FileMove aktiviert :

Code: Select all

For Each, Datei In Umbenennen
   {
      MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
      ;FileMove, % Datei["Alt"], Datei["Neu"]
   }
Dann kommt nach dem Start mit ^F6 wieder eine Fehlermeldung:
---------------------------
Fehler!
---------------------------
Folgende Dateinamen können nicht korrigiert werden:

D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Bilder zum Probieren\Problemfälle mit Index\B 123--4_4000-0000.bmp
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Bilder zum Probieren\Problemfälle mit Index\B 123--4_006-10030.bmp
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Bilder zum Probieren\Problemfälle mit Index\B 123--4_019c-0000.bmp

Sollen 5 dennoch umbenannt werden?
---------------------------
Ja Nein
---------------------------
Das sind 3 Fälle, für die das vorauszusehen war. Zumindest der letztere wird kaum Probleme machen, da eine zusätzliche Indizierung der Signatur mit Buchstaben innerhalb eines zweigliedrigen nicht zu erwarten ist. Denkbar wäre, die in solchen Fällen in der Fehlerliste gesammelten Namen bis nach der Umbenennung aufzubewahren, daß man sie dann anschließend genauer prüfen und manuell korrigieren kann.
Und bei den ersten beiden Fehlern wäre ja noch die Möglichkeit, falls sie signifikant häufig auftreten, daß es sich gar nicht um Fehler bei der Nummernvergabe handelt, sondern es einfach so viele Dateien sind, daß die Vorlage zu kurz erstellt worden ist. Dann würden in dieser MsgBox riesige Listen auftauchen.

Wenn ich dann in der Fehlermeldung mit "Ja" bestätige kommt wieder eine neue MsgBox:
---------------------------
Umbenennen!
---------------------------
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Bilder zum Probieren\Problemfälle mit Index\B 123--4_014-03.bmp
D:\Users\Bernhard\Eigene Hotkeys\HotKeys fürs Verzeichnen\Bilder zum Probieren\Problemfälle mit Index\B 123--4_014-0003.bmp
---------------------------
OK
---------------------------
Es werden - wie bei den Dateinamen ohne Index - nacheinander die Originale mit einer korrekten Vorschau verglichen. Dieses Mal werden die bereits allerdings diejenigen, die nicht verändert werden müssen, auch gar nicht angezeigt. Interessant dabei ist, daß einer unterschlagen wird: B 123--4_00018-0001.bmp. Der gehört weder zu den unlösbaren Fällen (3 Stück), noch zu den bereits korrekten (auch 3 .

Jetzt die Probe mit dem FileMove:

Code: Select all

For Each, Datei In Umbenennen
   {
      ;MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
      FileMove, % Datei["Alt"], Datei["Neu"]
   }
Zuerst kommt - natürlich - wieder dieselbe Fehlermeldung mit den 3 Unkorrigierbaren.
Nach dem Bestätigen mit "Ja" schließt sich das Fenster wieder, aber auch wars das dann.
Auch hier habe ich mal MsgBox und FileMove zusammen aktiviert:

Code: Select all

 For Each, Datei In Umbenennen
   {
      MsgBox, 0, Umbenennen!, % Datei["Alt"] . "`n`n" . Datei["Neu"]
      FileMove, % Datei["Alt"], Datei["Neu"]
   }
Und wieder passiert werden wie oben die Fehlermeldung und die Vorschauen (bis auf eine) korrekt durchgegangen, aber sonst tut sich nichts.
Die unterschlagene Datei ist übrigens immer dieselbe B 123--4_00018-0001.bmp, auch wenn ich die Bilder anders sortiere oder eine andere Ansicht wähle.

So, ich hoffe, das kann ein bißchen weiterhelfen.

Viele Grüße von Meister Lampe
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

09 Aug 2019, 06:12

Moin,

eigentlich war ich mir absolut sicher, dass ich das Folgende gestern schon gepostet habe:

FileMove: Spendiere dem Kommando im zweiten Parameter auch einen 'erzwungenen Ausdruck': FileMove, % Datei["Alt"], % Datei["Neu"]
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

13 Aug 2019, 16:45

Hallo just me!

Ja, jetzt tut sich was. Bei den Dateinamen ohne Index scheint das schon annähernd zu klappen. Allerdings läuft das Programm hier auch alle bereits korrekten Namen durch. Fragt also weiterhin in der ersten Fehleranzeige der Unkorrigierbaren, ob es die restlichen 9 (!) Dateien trotzdem umbenennen soll.Obwohl das nur bei 7 noch nötig wäre.
Bei denen mit Index wird ein großer Teil auch richtig korrigiert, nämlich alle, bei denen der Index nicht dem Vorlagenformat entspricht. Wenn aber der Index in Ordnung ist, wird eine fehlerhafte Signatur nicht geändert, sondern unterschlagen. Der Name taucht weder bei den "unlösbaren Fällen" am Beginn des Vorgangs auf, noch - wenn ich die MsgBox in der Schleife zusammen mit dem FileMove aktiviere - in einer der dann angezeigten Meldungen. Hier werden aber - im Unterschied zu den Fällen ohne Index (s.o.) - die bereits korrekten Dateinamen in der Vorschau nicht mehr mit angezeigt.

Schließlich könnte man sich doch mal überlegen, ob man, wie ich neulich bereits vorgeschlagen hatte, die Bestandssignatur AktSign nicht gleich aus der Vorlage heraus verwendet, statt sie von jedem Dateinamen separat abzutrennen und nacher wieder anzukleben.
Gründe dafür waren u.a.:
1.) Ich wähle für das Trimmen zwar eine Vorlage aus, aber der Bestandsname spielt dabei keine Rolle. Wenn ich an einem Bestand mit Namen A 565--4 arbeite, die Signatur 4 Stellen und der Index 3 Stellen haben soll, dann könnte ich statt A 565--4 | 0001 | 000 genausogut die Vorlage K 67 | 0001 | 000 auswählen, und würde dasselbe Ergebnis erhalten. Das erschien mir verwirrend und sinnlos.
2.) Was ist, wenn der Bestandsname nicht richtig geschrieben wurde? Warum nicht gleich ganz überschreiben bzw. durch den mit der Vorlage gewählten ersetzen? Damit reicht es, beim Aufsplitten des Dateinamens den vorderen Teil zu verwerfen, um nachher die aktuelle AktSign anzufügen.
Wäre das nicht auch im Code einfacher?

Viele Grüße von Bernhard
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

14 Aug 2019, 04:51

Hallo Bernhard,
Wenn aber der Index in Ordnung ist, wird eine fehlerhafte Signatur nicht geändert, sondern unterschlagen.
Ich schaue mir das noch mal an.

Die "Umbennung" bereits korrekter Dateinamen kann man einfach per Prüfung (AlterName != NeuerName) verhindern. Die Frage sollte dann in "Sollen die restlichen n Dateien trotzdem verarbeitet werden?" geändert werden.

Hinsichtlich der Vorgabe eines Bestandsnamens habe ich weiterhin meine Zweifel. Wenn der Benutzer eine "wilde" Mischung von Dateien markiert, die dann mit einem neuen Bestandsamen versehen werden, Ihre Signatur und ggf. ihren Index aber behalten, mag das zu recht merkwürdigen Ergebnissen führen. Willst Du das wirklich so haben?

Grüße, just me
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

19 Aug 2019, 16:12

Hallo just me!
Hinsichtlich der Vorgabe eines Bestandsnamens habe ich weiterhin meine Zweifel. Wenn der Benutzer eine "wilde" Mischung von Dateien markiert, die dann mit einem neuen Bestandsamen versehen werden, Ihre Signatur und ggf. ihren Index aber behalten, mag das zu recht merkwürdigen Ergebnissen führen. Willst Du das wirklich so haben?
Eigentlich ist das ja gerade der Zweck der Sache: Eine "wilde Mischung" von Formaten - und eben auch evtl. Tippfehlern - zu bereinigen. Im gleichen Ordner kommen immer auch nur Dateien vor, die zum gleichen Bestand gehören, aber eben nicht alle gleich sauber nach dem für ihn vorgegebenen Schema signiert. Um das zu bereinigen, ist das Script da. Wären das gemischte Dateien und würde ich auch noch unterschiedliche Bestandsnamen berücksichtigen wollen, dann müßte ich zu jeder Datei separat auch die entsprechende Vorlage einzeln aufrufen, da diese ja unterschiedliche Formate an Stellenzahlen in Signatur oder Index haben können.

Viele Grüße von Meister Lampe
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

20 Aug 2019, 04:36

Meister Lampe wrote:
13 Aug 2019, 16:45
...
Schließlich könnte man sich doch mal überlegen, ob man, wie ich neulich bereits vorgeschlagen hatte, die Bestandssignatur AktSign nicht gleich aus der Vorlage heraus verwendet, statt sie von jedem Dateinamen separat abzutrennen und nacher wieder anzukleben.
Gründe dafür waren u.a.:
1.) Ich wähle für das Trimmen zwar eine Vorlage aus, aber der Bestandsname spielt dabei keine Rolle. Wenn ich an einem Bestand mit Namen A 565--4 arbeite, die Signatur 4 Stellen und der Index 3 Stellen haben soll, dann könnte ich statt A 565--4 | 0001 | 000 genausogut die Vorlage K 67 | 0001 | 000 auswählen, und würde dasselbe Ergebnis erhalten. Das erschien mir verwirrend und sinnlos.
2.) Was ist, wenn der Bestandsname nicht richtig geschrieben wurde? Warum nicht gleich ganz überschreiben bzw. durch den mit der Vorlage gewählten ersetzen? Damit reicht es, beim Aufsplitten des Dateinamens den vorderen Teil zu verwerfen, um nachher die aktuelle AktSign anzufügen.
Wäre das nicht auch im Code einfacher?
...
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?
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

22 Aug 2019, 16:43

Hallo just me!
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?
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.

Jetzt habe ich noch eine Frage zum Anfang des Scripts. Dort steht zuerst die Überprüfung:

Code: Select all

 If (AktSign = "")
   {
      MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
      IfMsgBox Ok
      {
         Gosub Auswahlfenster
         return
      }
      else
      return
   }
Wenn keine Bestandsvorlage im Speicher ist, werde ich nach Ok automatisch zu dem Modul Auswahlfenster mit der Gui zum Auswählen der Vorlagen weitergeleitet. Aber nach der Auswahl dort komme ich nicht wieder zurück, sodaß die Routine einfach weiterlaufen würde, sondern ich muß sie mit ^F6 erneut starten! Wie kann ich das erreichen? Das Modul Auswahlfenster ist ja auch als eigenständige Routine mit F8 abrufbar und endet deshalb mit einem return, das kann ich ja nicht einfach durch einen Sprungbefehl ersetzen. Abgesehen davon, daß ich es ja dann nicht mehr von anderswo aufrufen könnte.

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

04 Sep 2019, 17:25

Hallo just me!

Ich habe mittlerweile meine separate Routine zur Ergänzung von Bildsignaturen ohne Bestandsnummern (AktSign) mit diesen nach dem vorgegebenen Muster verbessert:

Code: Select all

F12::
If (AktSign = "")
   {
      MsgBox, 17, Keine Bestandsvorlage!, Sie müssen zuerst eine Bestandsvorlage auswählen!
      IfMsgBox Ok
      {
         Gosub Auswahlfenster
         return
      }
      else
      return
   }
   
   If !(StellenIndex = "0")
   {
      ;Gosub, Trimmen_mI
      MsgBox, 16, Fehler!,  Sie können keine Signaturen mit Indizes ergänzen!`nBitte wähle Sie eine andere Vorlage aus.
      Gosub Auswahlfenster
      return
   }
   else
      
   Clipboard := ""
   SendInput, ^c
   Clipwait, 1
 
   DateienAuslese := Clipboard
   SignStellen := StellenSign
   IndexStellen := StellenIndex
   NewAktname := AktSign
   
   Loop, Parse, Dateienauslese, `n, `r
	{
      SplitPath, A_LoopField, , Verzeichnis, Erweiterung, SignRumpf	
	  
		; Wenn NameArray[2] mit einer oder mehreren Ziffer(n) beginnt und mit einer oder keiner 'Nichtziffer' endet ...
      If RegExMatch(SignRumpf, "^(\d+)(\D?)$", Match) 
      {
         ; MsgBox, % StrLen(Match1) . ": " . Match1 . "   <>   " . Match2
         If (StrLen(Match1) = SignStellen)
            NewSign := SignRumpf
         else
         {
            Match1 += 0 ; führende Nullen entfernen
            If !(StrLen(Match1) > SignStellen)
            {
               NewSign := Format("{:0" . SignStellen . "}", Match1) . Match2
               ; MsgBox, % StrLen(NewSign) . ": " . NewSign . "   <>   " . Match2
               ;FileMove, %A_LoopField%, %Verzeichnis%\%NewAktname%_%NewSign%.%Erweiterung%
            }
         }
         FileMove, %A_LoopField%, %Verzeichnis%\%NewAktname%_%NewSign%.%Erweiterung%
      }      	
   }  	
return	
Auch hier ergibt sich - wie ich bereits in meinem letzten Post geschrieben habe - das Problem, daß ich auf das Auswahlfenster mit Gosub umlenke, aber danach nicht wieder zurückkomme. Müßte man dazu den Abschluß dieser Subroutine ganz anders gestalten? Statt mit return mit einem (oder mehreren?) anderen Befehlen?
Und, was bereits seit Langem aussteht:
Ich habe immernoch nicht herausbekommen, warum das Progressfenster, das ich als Ersatz für ein animiertes Wartesymbol erstellt habe, nicht die ganze Zeit während dem Umbenennen-Vorgang angezeigt wird, sondern nur kurz aufblitzt.

Viele Grüße von Meister Lampe
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

05 Sep 2019, 04:52

Moin,

zum Thema Progress habe ich als letztes das gefunden:

Code: Select all

Progress, m2 fs12 zh0 ct0000ff CWffffff B, Bin gleich fertig ..., , Vorschau, Verdana
...
Progress, Off
return
Um zu wissen, warum das Fenster nicht dauerhaft angezeigt wird, wäre es wichtig zu wissen, was sich hinter

Code: Select all

...
verbirgt.

Beim Thema Bestandsvorlage kann ich immer noch kein Problem erkennen. 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. Einen 'normalen' Mitarbeiter sollte das auch nicht überfordern.

Grüße, just me
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

05 Sep 2019, 16:04

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
just me
Posts: 9426
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Optimierung Umbenennungstool

06 Sep 2019, 03:31

Moin!

Progress:
Wenn die Anweisung so eingebaut ist und nur einmal kurz zu sehen ist, kann das eigentlich nur daran liegen, dass die Aktivitäten im Explorerfenster dieses über das Progressfenster schieben. Wenn Du das Skript innerhalb der Umbenennungsschleife mit Pause anhältst, kannst Du schauen, wo das Progressfenster abgeblieben ist.

Auswahlfenster:
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?
Subroutinen, die mit Gosub aufgerufen werden, kehren immer wieder zurück, wenn sie per Return beendet werden. Im Skript sorgt aber die Return Anweisung hinter dem Gosub dafür, dass die aufrufende Subroutine verlassen wird.

Trimmen-Funktion:
Das Array mit den fehlerhaften Dateien NamensFehler[] steht am Ende der ^F6 Routine zur Verfügung. Du kannst an dieser Stelle damit machen, was immer Du willst.

Grüße, just me
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

22 Oct 2019, 16:56

Hallo just me!
Subroutinen, die mit Gosub aufgerufen werden, kehren immer wieder zurück, wenn sie per Return beendet werden. Im Skript sorgt aber die Return Anweisung hinter dem Gosub dafür, dass die aufrufende Subroutine verlassen wird.
Hier habe ich, glaube ich, die Ursache gefunden:
Es handelt sich ja um zwei Subroutinen. Zuerst wird mit Gosub Auswahlfenster die Gui mit der Liste geöffnet, wo man sich die gewünschten Bestandsnamen auswählen soll. Dafür schließt sich die MsgBox "Keine Bestandsvorlage!" kurz. Aber der Code zum Öffnen der Gui endet mit einem return und damit läuft auch das Programm weiter, während die Gui auf eine Eingabe über die Subroutine Anwenden wartet, die ebenfalls mit return abschließt. Gibt es also einen anderen Befehl, mit dem man den Code zum Öffnen der Gui Auswahlfenster abschließen kann, daß der ohne zurückzuspringen auf die nächste Eingabe wartet?

Viele Grüße von Meister Lampe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

31 Oct 2019, 17:26

Hallo just me!

Ist es überhaupt möglich, eine Gui innerhalb eines laufenden Programmes "aufpoppen" zu lassen? Im konkreten Fall wäre das Folgendes:
Soweit ich im Tutorial gesucht habe, besteht im Gegensatz zur MsgBox bei der InputBox keine Möglichkeit, sie durch Veränderung der Parameter mit einem dritten Button zu versehen. Wenn man also ein Steuerelement mit Weiter - Ändern - Abbrechen zusammen mit einer Eingabemöglichkeit haben möchte, müßte man sich eine eigene Gui dafür erstellen. Da das dann aber wieder mit dem Aufruf von Subroutinen/Gosub und zwei return-Befehlen verbunden ist, wie ich ja bereits in meinem vorigen Post erwähnte, käme ich nicht mehr ins laufende Programm zurück. :?
Das wäre letztlich fast dasgleiche Problem wie oben und vielleicht auch dieselbe Lösung.
Wie könnte die aussehen?

Viele Grüße von Meister Lampe

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 4 guests