Optimierung Umbenennungstool

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

05 Feb 2019, 02:04

Hallo just me!

Ich erhalte da nur den Fehler

Code: Select all

Ambiguous or invalid use of "."
     Specifically: ...
und kann das Script gar nicht starten.

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

Re: Optimierung Umbenennungstool

05 Feb 2019, 02:35

Hallo Meister Lampe,

für welchen Code erhältst Du den Fehler?
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

07 Feb 2019, 17:55

Hallo just me!

Also der oben erwähnte Fehler war echt doof. Ich hatte mit aller - zuviel (!) - Sorgfalt Deinen Code in meinen Script kopiert und die Variablen- und Pfadnamen angepaßt, aber vergessen, die drei Pünktchen zwischen den zwei Zeilen herauszunehmen. :thumbdown:

Mit einer Variablen klappt es jetzt.
Abspeichern in der Gui:

Code: Select all

;Im Kopf des Scripts festgelegt
IniDatei := A_ScriptDir . "\Bestandssignaturen_AHK.ini"
;--------
GuiClose:
ButtonSpeichern:
Gui, Submit  ; Speichert die Benutzereingaben in die entsprechenden Steuerelementvariablen.
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
AktSign := BestandAuswahl

; Syntax: IniWrite, Wert, Dateiname, Sektion, Key
IniWrite, %AktSign%, %IniDatei%, Einstellungen, AktSign
return
und nachher zum Lesen:

Code: Select all

^F8::
; Syntax: IniRead, AusgabeVar, Dateiname, Sektion, Key [, Standardwert]
IniRead, AktSign, %IniDatei%, Einstellungen, AktSign, 4 ; vier ist der Vorgabewert, falls die Datei oder der Eintrag noch nicht existieren.
MsgBox, In der Ini-Datei ist gespeichert : %AktSign%
return
Jetzt habe aus Excel eine .csv-Tabelle erstellt und mit mehreren Datensätzen gefüllt.
Der Name der Datensätze soll dann gleich dem Bestandsnamen sein, damit man sie damit aufrufen kann. Du hast gesagt, das wäre dann der Sektionsname.
Das müßte dann irgendwie so aussehen:

Code: Select all

BestListe := A_ScriptDir . "\Signaturentabelle_AHK.csv" ; (oben)

SektName := AktSign

; Namen der verwendeten Variablen und Tabellenüberschriften sind
; Sektname - AktSign - StellenSign - StellenIndex
IniWrite, %Sektname%	%AktSign%	%StellenSign%	%StellenIndex%, %BestListe%, %SektName%, SektName
; Die Lücken sind Tabulatorschritte, nicht immer gleich lang.
return
und zum Lesen:

Code: Select all

^F9::
BestListe := A_ScriptDir . "\Signaturentabelle_AHK.csv" ; (oben)

;IniRead, AktSign StellenSign StellenIndex, %BestListe%, %Sektname%, AktSign 

MsgBox, Die Bestandseinstellungen lauten: %AktSign% - %StellenSign% - %StellenIndex%
return
Neue Werte werden in der Tabelle abgespeichert - das kann man erkennen, wenn man sie manuell öffnet, aber das Auslesen klappt noch nicht. Die oben ausgeblendete IniRead-Zeile ergibt einen Fehler beim Starten des Scriptes.
Obwohl ich auch nicht weiß, ob der Datensatzname dort richtig eingetragen wird. in der Tabelle steht naämlich statt "K 234--1" jetzt in zwei Zeilen "[K 234--1]" und dann "SektName=K 234--1".
Vielleicht klappt es deshalb mit dem Aufrufen nicht.
Oder man muß an die .csv-Datei ganz anders herangehen. Im Tutorial sind auch die File-Funktionen erwähnt. FileRead, FileWrite, usw. Was ist da der Unterschied bzw. angebrachter?

Viele Grüße von Meister Lampe

Viele Grüße
hd0202
Posts: 183
Joined: 04 Oct 2013, 03:07
Location: Germany near Cologne

Re: Optimierung Umbenennungstool

08 Feb 2019, 01:23

ich denke, das sollten einzelne Einträge sein:

Code: Select all

; Syntax: IniWrite, Wert, Dateiname, Sektion, Key
IniWrite, %AktSign%, %IniDatei%, Einstellungen, AktSign
IniWrite, %Sektname%, %IniDatei%, Einstellungen, Sektname
IniWrite, %StellenSign%, %IniDatei%, Einstellungen, StellenSign
IniWrite, %StellenIndex%, %IniDatei%, Einstellungen, StellenIndex
return
und per IniRead sollten alle 4 Werte entsprechend wieder einzeln eingelesen werden

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

Re: Optimierung Umbenennungstool

08 Feb 2019, 04:07

Moin,

wenn ich das richtig verstehe

Code: Select all

BestListe := A_ScriptDir . "\Signaturentabelle_AHK.csv" ; (oben)
enthält die Variable BestListe den Pfad und Namen einer CSV-Datei. CSV-Dateien haben eine koplett andere innere Struktur als INI-Dateien. Man sollte deshalb nicht versuchen, mit IniRead/IniWrite auf CSV-Dateien zuzugreifen.

Stell doch mal ein paar Zeilen einer CSV-Datei ein und sage uns, was mit den einzelnen Sätzen und Feldern gemacht werden soll.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

08 Feb 2019, 18:54

Hallo hd0202 & just me!
ich denke, das sollten einzelne Einträge sein: ..
Die Variablen sollen ja zusammen als ein Datensatz unter dem Namen des Bestandes (= AktSign) abgespeichert werden und damit auch wieder aufzurufen sein. Wenn man das in einzelnen Schritten macht, scheint das nicht dasselbe zu sein.

Zur Klärung der Anforderung an die Datei/Tabelle etc.:
Die Rechner unserer Büros sind vernetzt und es ist angedacht, daß auch andere Kollegen dieses Tool verwenden. Deshalb habe ich mich für eine externe Datei entschieden, die dann so im (internen) Netz plaziert wird, daß alle auf diese Vorlage Zugriff haben, aber sie auch erweitern können.
wenn ich das richtig verstehe,
[..]
enthält die Variable BestListe den Pfad und Namen einer CSV-Datei.
Ja, so war das gedacht. So hattest Du es ja auch bei Deinem Beispiel für die .ini-Datei gemacht.

Meine .csv-Datei sieht jetzt so aus:

Code: Select all

SektName	AktSign	StellenSign	StellenIndex
[B 727--1]
SektName=B 727--1	B 727--1	4	4
[D 180--2]
SektName=D 180--2	D 180--2	6	3
[E 123--1]
SektName=E 123--1	E 123--1	5	2
[K 234--1]
SektName=K 234--1	K 234--1	4	4
[Z 396--1]
SektName=Z 396--1	Z 396--1	3	5
Das Eintragen von neuen Werten funktioniert anscheinend mit dem Code, den ich Dir oben beschrieben habe. Allerdings scheint das erst mit einem Reload des Programms zu geschehen. Wenn ich also beim laufenden Script mit der Gui die Signatureinstellungen verändere, bleiben die vorher verwendeten nicht erhalten.
Man sollte deshalb nicht versuchen, mit IniRead/IniWrite auf CSV-Dateien zuzugreifen.
Was für eine Methode empfielst Du stattdessen?

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

Re: Optimierung Umbenennungstool

09 Feb 2019, 04:08

Moin Meister Lampe,

Dein Dateibeispiel wirkt auf mich recht ungewöhnlich. Normalerweise würde ich mir eine aus Excel erstellte CSV-Datei eher so vorstellen

Code: Select all

SektName	AktSign	StellenSign	StellenIndex
B 727--1	B 727--1	4	4
B 180--2	B 180--2	6	3
evtl. auch ohne das verdoppelte Aktenzeichen in den ersten beiden Spalten.

Eine so aufgebaute Datei bietet keine Möglichkeit für einen Direktzugriff über Aktenzeichen/Sektionnamen. Man liest sie üblicherweise beim Start des Skripts komplett ein und legt die Werte in einer geeigneten Struktur ab.

Eine entsprechende INI-Datei sähe für mich eher so aus

Code: Select all

[B 727--1]
StellenSign=4
StellenIndex=4
[D 180--2]
StellenSign=6
StellenIndex=3
So kann man per IniRead entweder über das Aktenzeichen auf die Stellenwerte zugreifen oder eine komplette Liste der Aktenzeichen einlesen und die dann für spätere Zugriffe verwenden.

Ich habe aber auch noch eine Frage zur Verwendung der Datei. Z.Zt. kann ich da nur 3 unterschiedliche Werte erkennen:
  1. AktenZeichen (AktSign)
  2. Stellenanzahl Signatur (StellenSign)
  3. Stellenanzahl Index / lfd. Nummer (StellenIndex)
Die Wertet werden unter dem 'Schlüssel' Aktenzeichen verwaltet und sollen wohl bei wiederholtem Zugriff auf ein Aktenzeichen Vorgaben liefern. An welcher Stelle in Deinem Skript soll auf diese Daten zugegriffen werden?
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

10 Feb 2019, 18:01

Hallo just me!
Dein Dateibeispiel wirkt auf mich recht ungewöhnlich. Normalerweise würde ich mir eine aus Excel erstellte CSV-Datei eher so vorstellen...
Mich hatte die Struktur auch etwas irritiert. Wobei ich hinzufügen muß, daß die Datei nach der Konvertierung aus Excel heraus als Trennzeichen Semikola benutzt hatte. Als ich dann meine Codezeile

Code: Select all

IniWrite, %Sektname%	%AktSign%	%StellenSign%	%StellenIndex%, %BestListe%, %SektName%, SektName
ausprobiert habe, sah ich, daß 1. die Tabelle tatsächlich erweitert wurde und 2. als Trennzeichen hier Tabulatoreinrückungen verwendet wurden. Daraufhin habe ich die anderen Semikola ebenfalls durch solche ersetzt.
Wenn ich Deine beiden Beispiele sehe, so scheint meines eine Art Mischform zu sein: Einerseits mit einer Namensüberschrift für den Datensatz in eckigen Klammern in einer gesonderten Zeile darüber wie in der .ini-Datei, andererseits die weiteren Werte - jetzt ohne den Variablennamen mit Gleichheitszeichen davor - durch Tabulatorschritte getrennt darunter.
Ich habe aber auch noch eine Frage zur Verwendung der Datei. Z.Zt. kann ich da nur 3 unterschiedliche Werte erkennen:

AktenZeichen (AktSign)
Stellenanzahl Signatur (StellenSign)
Stellenanzahl Index / lfd. Nummer (StellenIndex)

Die Wertet werden unter dem 'Schlüssel' Aktenzeichen verwaltet und sollen wohl bei wiederholtem Zugriff auf ein Aktenzeichen Vorgaben liefern. An welcher Stelle in Deinem Skript soll auf diese Daten zugegriffen werden?
Ich hatte mir Folgendes vorgestellt:
Zum Umbenennen/Neusignieren der Bilder benötige ich die drei Werte, die Du oben aufführst: Den Namen des Aktenbestandes (AktSign), die Stellenanzahl für Signaturnummer der Akte im Bestand (StellenSign) und die Stellenanzahl für einen laufenden Index innerhalb der Akte, wie z.B. die Seitennummer (StellenIndex). In meinem jetzigen Script ist dafür der Standard A 96--1, 4, 4 vorgegeben. Über den Aufruf der Gui können dann aber andere Werte eingegeben werden, die nur temporär zu Verfügung stehen und bei jedem Neustart des Programms wieder weg sind. Das soll sich jetzt ändern. Die Variablen müßten also mit dem Speichervorgang beim Schließen der Gui durch den Speicher-Button in die .csv, .ini oder sonst eine externe Datei abgelegt werden. Und entsprechend sollte man sie beim nächsten Mal, wenn man die Gui öffnet, auch wieder zur Auswahl vorliegen haben. Dafür bekäme der Datensatz dann denselben Namen wie der Bestand. Vielleicht, daß man dazu eine das Edit-Feld für die Eingabe der AktSign durch eine ComboBox ersetzt.
Aber zuerst muß ich natürlich wissen, mit welcher Art von externer Datei zum Abspeichern und welchen AHK-Befehlen das am besten/geschicktesten zu bewerkstelligen ist.

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

Re: Optimierung Umbenennungstool

11 Feb 2019, 05:11

Moin Meister Lampe,

es verstehe gelegentlich immer noch nicht wirklich, wo Du hinwillst. Vielleicht liegt das auch daran, dass ich den Sinn des Ganzen noch nicht vollständig erfasst habe.

Mir scheint es darum zu gehen, Dateien halbautomatisch umzubenennen. Über die alten Namen liefert dieser Beitrag keine Informationen. Die neuen Namen haben wohl folgenden Aufbau:
  • Bestandsname / Aktenzeichen (konstant)
  • _
  • Signatur (zumindest innerhalb einer Aktion konstant)
  • -
  • Index / lfd. Nummer
  • .
  • Dateierweiterung
Signatur und Index sind numerisch und sollen mit fester Stellenzahl mit führenden Nullen ausgegeben werden.

Ist-Zustand: Z.Zt. sind der Bestandsname und die Stellenanzahlen von Signatur und Index im Skript als konstante Werte abgelegt. Der Wert für die Signatur wird mit einer InputBox abgefragt / bestätigt. Dabei ist es auch möglich, einen Startwert für den Index einzugeben. Wenn das nicht stimmt, korrigiere es bitte.

Soll-Zustand: Es ist Deine Aufgabe, das möglichst konkret zu beschreiiben.

Wenn der Soll-Zustand ausreichend konkret beschrieben ist, geht es mit der Klärung folgender Fragen weiter:
  • Was brauchen wir, um das zu realisieren?
  • Was davon haben wir?
  • Wie schließen wir evtl. Lücken?
Wenn das zu keinem befriedigendem Ergebnis führt, muss überprüft werden, ob die Zielstellung (Soll-Zustand) an die Realität angepasst werden muss.

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

Re: Optimierung Umbenennungstool

11 Feb 2019, 18:20

Hallo just me!

Worum es grundsätzlich geht, hatte ich Dir im Vorgänger-Thread "Mehrere Objekte mit der Maus markieren" https://www.autohotkey.com/boards/viewtopic.php?f=9&t=45349&start=20#p245117 beschrieben. In dem Post vom 20 Oct 2018, 20:05 hatte ich Dir die Einzelheiten erklärt.
Mir scheint es darum zu gehen, Dateien halbautomatisch umzubenennen. Über die alten Namen liefert dieser Beitrag keine Informationen. Die neuen Namen haben wohl folgenden Aufbau:

Bestandsname / Aktenzeichen (konstant)
_
Signatur (zumindest innerhalb einer Aktion konstant)
-
Index / lfd. Nummer
.
Dateierweiterung

Signatur und Index sind numerisch und sollen mit fester Stellenzahl mit führenden Nullen ausgegeben werden.

Genau so ist es gemeint. Die "alten" Nummern haben keinerlei Bezug und sorgen lediglich dafür, daß die Bilder bzw. Scans in der richtigen Reihenfolge liegen. Das ist eben diejenige, wie sie aus dem Scanvorgang herauskommen.

Ist-Zustand:
Dieser entspricht nicht mehr ganz demjenigen, den ich am Anfang dieses Threads gepostet hatte, da ich inzwischen eine Gui hinzugefügt habe. Die habe ich Dir zwar immer erwähnt, aber leider versäumt, Dir das neue Script ganz zu zeigen.
Das sieht jetzt so aus:

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force
SetTitleMatchMode, RegEx

;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
GroupAdd, Explorer, ahk_class ExploreWClass 
GroupAdd, Explorer, ahk_class CabinetWClass

;------------------------------------------------------------------------
; Aktuelle Signaturen und Fenster definieren:
SetBatchLines, -1
ShellApp := ComObjCreate("Shell.Application")
AktSign := "A 96--1"
Auswahl := []
LetzteDatei := ""
LetzteSign := 0
StellenSign := 4
StellenIndex := 4
SignVorlage := 0000
IndexVorlage := 0000
Return

;------------------------------------------------------------------------
; Userform zur Eingabe der Zählparameter
F7::
Ansagen:
Gui,1: New,,
Gui,1: Show, x100   y100    h195  w375, Signierungsvorlage
Gui,1: Font, s10 , Verdana

GuiText_1 = Geben Sie hier den Standard für das nächste Umbenennungsprojekt ein!
Gui,1: Add, Text, x20      y20    h45   w350           , %GuiText_1% 
Gui,1: Add, Text, x20      y65    h30   w60            , Bestand:
Gui,1: Add, Text, x115     y65    h30   w60            , Signatur:
Gui,1: Add, Text, x190     y65    h30   w90            , Index:
Gui,1: Add, Text, x123     y95    h25   w15            , _
Gui,1: Add, Text, x210     y95    h25   w15            , -

Gui,1: Add, Edit, cblue    x20    y90     h25   w100      vBestandAuswahl, %AktSign%
Gui,1: Add, Edit, cblue    x135   y90     h25  w70      vSignVorlage, %SignVorlage%
Gui,1: Add, Edit, cblue    x220   y90     h25  w70      vIndexVorlage, %IndexVorlage%
GuiControl, Focus, BestandAuswahl

Gui,1: Add, Button,       x20    y135    h30   w100     Default, Speichern 
Gui,1: Add, Button,       x150   y135    h30   w100     gAbbrechen, Abbrechen
return  

Abbrechen:
Gui, Cancel
return

GuiClose:
ButtonSpeichern:
Gui, Submit  ; Speichert die Benutzereingaben in die entsprechenden Steuerelementvariablen.
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
AktSign := BestandAuswahl
; hier müßte wohl auch die externe Abspeicherung stattfinden!
return

;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F7::
VorschauSign := Format("{:0" . StellenSign . "}", 1)
VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
Progress, m2 fs12 zh0 ct0000ff CWffffff, %VorschauMsg%, , Vorschau,Verdana
return

;------------------------------------------------------------------------
; Bilder umbenennen im Windows Explorer
#IfWinActive ahk_group Explorer

<!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%
   ; 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
   }
   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 := ""
Return

#If ; Ende des bedingten HotKey
;------------------------------------------------------------------------
; Beenden des Scriptes
Escape::
ExitApp
Return
Der eigentliche Umbenennen-Vorgang ist geblieben wie bisher. Die erste der umzubenennenden Dateien wird markiert. Mit Alt+Linker Mausklick auf der letzten werden alle markiert und es öffnet sich eine InputBox, die die nächste laufende Signatur vorschlägt, in die man aber auch eine andere eingeben kann und - falls gewollt - auch durch ein Komma abgetrennt, dahinter einen anderen Startindex als den Standard 0 vorgeben kann. Mit OK wird dann die Umbenennung durchgeführt. Das ist bzw. war das Ergebnis des alten Threads undklappt jetzt prima.
Neu hinzugekommen ist eine Gui, die mit F7 aufgerufen wird und in der man jetzt alle Werte neu eingeben kann. Diese werden dann, solange das Script läuft und nicht reloadet wird, für die Umbenennung verwendet. Dazugekommen ist auch eine kleine Vorschau, die mit Strg+F7 aufgerufen wird und das aktuelle Format aufzeigt. Diese wurde mit dem Progress-Element kreiert, da so die Möglichkeit besteht, die Schrift zu formatieren.

Soll-Zustand:
Mit dem Schließen der Gui durch den Speichern-Button sollen die neu eingegebenen Werte auch in die externe Datei mit abgespeichert werden.
Das Eingabefeld

Code: Select all

Gui,1: Add, Edit, cblue    x20    y90     h25   w100      vBestandAuswahl, %AktSign%
wird durch eine ComboBox ersetzt, in der man Blättern und die abgespeicherten Einstellungen (bestehend aus jeweils 3 Werten) wieder aufrufen, unter ihnen auswählen oder neue hinzufügen kann. Vermutlich muß dazu die ganze Tabelle geöffnet und geladen werden.
Letztlich ist vorgesehen, diese dann zentral in unserem Netzwerk abzulegen, damit mehrere Kollegen mit dem Tool arbeiten können und dieselben Nummerierungsstandards verwenden. Wenn die Tabelle jeweils nur für das Eingeben und Aufrufen der Einstellungen geladen wird, also nur während die Gui geöffnet ist und nicht die ganze Zeit wenn das Script läuft, dann dürfte es wohl kaum Schwierigkeiten machen, daß man sich dabei ins Gehege kommt.
Ich hoffe, Deine Fragen zu meinen Vorstellungen hiermit beantwortet zu haben.

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

Re: Optimierung Umbenennungstool

12 Feb 2019, 04:01

Moin Meister Lampe,

ich verstehe nicht, warum Du das so realisieren willst. Nach der aktuellen Zielvorstellung bleibt es dabei, dass ein bestimmter Bestandsname fest im Skript vorgegeben ist. Dazu kommen noch feste Vorgaben für den Inhalt und die Stellenanzahl von Signatur und Index.

Die letzten beiden Werte können während des Umbenennungsvorgangs durch Vorgabe neuer Startwerte über eine InputBox angepasst werden, allerdings nur die Werte, nicht die Stellenanzahlen.

Außerdem können über ein Fenster, das per Hotkey angezeigt wird, neue Werte für den Bestandsnamen, die Signatur und den Index vorgegeben werden. Die Stellenanzahlen für Signatur und Index werden dann aus den Vorgaben neu errechnet. Diese neuen Vorgaben werden anschließend vom Skript benutzt.

Als Ziel formulierst Du jetzt lediglich, dass die per Fenster vorgenommenen Änderungen in einer Datei gespeichert werden sollen. Das Skript soll auf diese Datei zugreifen können, um bestehende Vorgaben wieder abrufen zu können. Damit soll gewährleistet werden, dass alle Kollegen, die mit dem Skript arbeiten, identische Nummerierungsstandards verwenden.

Das kann man natürlich so machen, aber ...

Wenn es darum geht, Standards durchzusetzen, sollte immer nur ein möglichst kleiner Kreis handverlesener Personen die Standards setzen dürfen. Dazu können diese Personen die Datei (unabhängig vom Skript) mit den Vorgaben füllen.

Alle 'normalen' Benutzer sollten über das Skript nur lesend auf die Datei zugreifen. Dazu wird beim Start des Skripts das Auswahlfenster angezeigt. Um dem Benutzer das Leben zu erleichtern, könnte man die zuletzt getroffene Auswahl in einer benutzereigenen INI-Datei speichern und dann beim Start des Skripts als Auswahl präsentieren.

Was hältst Du davon?
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

12 Feb 2019, 08:39

Hallo just me!
Nach der aktuellen Zielvorstellung bleibt es dabei, dass ein bestimmter Bestandsname fest im Skript vorgegeben ist. Dazu kommen noch feste Vorgaben für den Inhalt und die Stellenanzahl von Signatur und Index.
Das bezieht sich auf den Ist-Zustand. Diese Vorgaben sind im Kopf des Scripts enthalten, damit überhaupt etwas vorgeschlagen wird, der Benutzer gleich ein Beispiel sehen kann und ich erkennen kann, wann sich etwas verändert, neu abgespeichert wird oder alte Werte verwendet werden. Wenn eine externe Datei diese Werte abspeichert, würden solche Vorschläge natürlich von dort kommen. Z.B. der erste Wert in der Tabelle, der letzte dort abgespeicherte oder der letzte verwendete.
Außerdem können über ein Fenster, das per Hotkey angezeigt wird, neue Werte für den Bestandsnamen, die Signatur und den Index vorgegeben werden. Die Stellenanzahlen für Signatur und Index werden dann aus den Vorgaben neu errechnet. Diese neuen Vorgaben werden anschließend vom Skript benutzt.
Neu berechnet und abgespeichert sollen die Werte, die ich für einen einzelnen Umbenennungsvorgang in die InputBox eingebe, eigentlich nicht. Die jeweiligen Stellenanzahlen z.B. werden dadurch ja nicht verändert, lediglich die bei der Zählung verwendeten Aktennummern. Standardmäßig wird diese um jeweils eins erhöht, soll eine andere verwendet werden, so gibt man diese ein. Die eigentliche, automatisierte Durchnummerierung ist die der Indizes. Die beginnen standardmäßig mit 0, aber auch das kann falls gewünscht über die Inputbox verändert werden.
Wenn es darum geht, Standards durchzusetzen, sollte immer nur ein möglichst kleiner Kreis handverlesener Personen die Standards setzen dürfen. Dazu können diese Personen die Datei (unabhängig vom Skript) mit den Vorgaben füllen.

Alle 'normalen' Benutzer sollten über das Skript nur lesend auf die Datei zugreifen. Dazu wird beim Start des Skripts das Auswahlfenster angezeigt. Um dem Benutzer das Leben zu erleichtern, könnte man die zuletzt getroffene Auswahl in einer benutzereigenen INI-Datei speichern und dann beim Start des Skripts als Auswahl präsentieren.
Das wäre eine schöne Lösung. Man könnte das Tool in zwei Versionen herausbringen, wobei man bei der einen die Funktion zum Abspeichern deaktiviert.

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

Re: Optimierung Umbenennungstool

13 Feb 2019, 05:41

Moin,

ich habe Dein Skript mal so umgebaut, wie ich mir das vorstellen würde. Es ist nur kurz getestet und mag deshalb noch Fehler enthalten:

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance force
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetTitleMatchMode, RegEx
SetBatchLines, -1

;------------------------------------------------------------------------
; Shell-Objekt erzeugen
ShellApp := ComObjCreate("Shell.Application")

;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
GroupAdd, Explorer, ahk_class ExploreWClass
GroupAdd, Explorer, ahk_class CabinetWClass

;------------------------------------------------------------------------
; Dateien
AuswahlDatei := A_ScriptDir . "\Auswahl.txt" ; A_AppData
VorgabenDatei := A_ScriptDir . "\Bestandsvorgaben.txt"

Auswahl := FileExist(AuswahlDatei) ? FileOpen(AuswahlDatei, "r").Read() : ""
If !(File := FileOpen(VorgabenDatei, "r")){
   MsgBox, 16, Fehler!, Die Datei %VorgabenDatei% konnte nicht geöffnet werden!
   ExitApp
}
Vorgaben := StrSplit(File.Read(), "`n", "`r")
File.Close()

;------------------------------------------------------------------------
; Auswahlfenster erstellen
Rows := (L := Vorgaben.Length()) > 10 ? 10 : L
GuiText_1 := "Wählen Sie hier den Standard für das nächste Umbenennungsprojekt aus!"
Gui, Margin, 20, 20
Gui, Font, s10 , Verdana
Gui, Add, Text, xm w350, %GuiText_1%
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl, Bestand|Signatur|Index
For Each, Vorgabe In Vorgaben
{
   Felder := StrSplit(Vorgabe, "`t")
   Option := (Felder[1] = Auswahl) ? "Focus Select" : ""
   LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")
Gui, Add, Button, xm  h30 w100 Default gAnwenden, Anwenden
Gui, Add, Button, x270 yp h30 w100 gAbbrechen, Abbrechen
Gosub, Auswahl
Return

;------------------------------------------------------------------------
; Auswahlfenster anzeigen
F7::
Auswahl:
Menu, Tray, Icon, , , 1
Suspend, On
GuiControl, Focus, BestandAuswahl
Gui, Show, x100 y100, Signierungsvorlage
Return

;------------------------------------------------------------------------
; Auswahl übernehmen
Anwenden:
If !(Row := LV_GetNext())
{
   MsgBox, 16, Fehler!, Bitte wählen Sie einen Bestand aus!
   GuiControl, Focus, BestandAuswahl
   Return
}
LV_GetText(AktSign, Row, 1)
LV_GetText(SignVorlage, Row, 2)
LV_GetText(IndexVorlage, Row, 3)
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
; hier müßte wohl auch die externe Abspeicherung stattfinden!
If (AktSign <> Auswahl)
{
   Auswahl := AktSign
   File := FileOpen(AuswahlDatei, "w")
   File.Write(Auswahl)
   File.Close()
}
Gui, Cancel
Gosub, Anzeige
Suspend, Off
Menu, Tray, Icon, , , 0
Return

;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
ExitApp

;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F7::
Anzeige:
VorschauSign := Format("{:0" . StellenSign . "}", 1)
VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
Progress, m2 fs12 zh0 ct0000ff CWffffff, %VorschauMsg%, , Vorschau, Verdana
SetTimer, ProgressOff, 2000
Return

ProgressOff:
Progress, Off
Return

;------------------------------------------------------------------------
; Bilder umbenennen im Windows Explorer
#IfWinActive ahk_group Explorer

<!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%
   ; 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
   }
   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 := ""
Return

#If ; Ende des bedingten HotKey
;------------------------------------------------------------------------
; Beenden des Scriptes
Escape::
ExitApp
Return
Meine Bestandsvorgaben.txt Datei sieht so aus:

Code: Select all

B 727--1	0000	0000
D 180--2	000000	000
E 123--1	00000	00
K 234--1	0000	0000
Z 396--1	000	00000
Es sind drei Felder: Bestandsname, Signaturmuster, Indexmuster. Feldtrenner ist Tab / `t. Ich habe die Datei einfach mit Notepad/Editor erstellt. Ein schreibender Zugriff aus dem Skript heraus ist nicht vorgesehen.

Die per InputBox möglichen Änderungen werden für die Vorgaben derzeit nicht berücksichtigt.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

13 Feb 2019, 17:44

Hallo just me!

Erstmal vielen Dank für Deine Mühe!
Das sieht wirklich schon einmal ganz gut aus. Bevor ich da in die Einzelheiten gehe, zu Deiner letzten Bemerkung:
Die per InputBox möglichen Änderungen werden für die Vorgaben derzeit nicht berücksichtigt.
Das ist auch völlig in Ordnung. Diese Option gehört ja zum eigentlichen Signierungsmodul und hat mit den längerfristig festzuhaltenden Standards nichts zu tun.

1.) Wenn ich Deinen Code richtig verstanden habe, dann benützt Du neben der eigentlichen Auswahltabelle namens Bestandsvorgaben.txt noch eine lokale Datei namens Auswahl.txt, um den jeweils zuletzt verwendeten Bestandsnamen festzuhalen, die dann immer neu überschrieben wird. Schöne Idee!
2.) Ich habe jetzt die Hotkeys F7 und Strg+F7 durch F8 und Strg+F8 ersetzt. Nachdem es im Ablauf mehrmals Schwierigkeiten gab, stellte sich heraus, daß diese im SciTE4AutoHotkey-Editor für Debuggen und Compilieren stehen und das jetzt ausgelöst haben. Mir ist schleierhaft, warum das bisher reibungslos gelaufen ist. Wenn das Script zufriedenstellend läuft, werde ich das vor dem Compilieren wieder ersetzen, da ein Kollege es bereits in der aktuellen Version testet und nicht irritiert werden soll.
3.) Dein Script öffnet die Gui automatisch gleich beim Start. Das braucht, ja sollte nicht sein. Der Code zum Umbenennen der Bilder ist nur ein - wenn auch der wohl umfangreichste - Bestandteil in einem größeren Tool, das aber eben noch andere praktische Hilfen erhält. Teils banale Sachen wie

Code: Select all

:*:sgh::Sehr geehrter Herr {!}{left}
aber auch ganz spezifische Befehle, die sich auf die Arbeit mit unseren Scannern beziehen und deren Handhabung etwas leichter machen. Die laufen dann zwar nur während der Arbeit mit der jeweiligen Hardware und Software, aber in dem Tool sind sie enthalten, auch bei denjenigen Kollegen, die nicht damit arbeiten. Das ist also auch für andere Zwecke bestimmt und nicht nur fürs Umsignieren von Bildern. Wer diese Funktion benötigt, der soll sich die Auswahl dazu über F8 holen können. Dasselbe gilt auch für das Schließen der Gui mit dem Abbrechen-Button. Dabei soll nicht gleich das ganze Script beendet werden. Deshalb habe ich den Befehl ExitApp durch ein return ersetzt:

Code: Select all

; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
;ExitApp
return
4.) Aber auch danach kann ich, wenn ich die Gui mit "Abbrechen" schließe, sie später nicht wieder mit F8 öffnen noch die Vorschau mit Strg+F8 aufrufen.
5.)
Ein schreibender Zugriff aus dem Skript heraus ist nicht vorgesehen.
Ja, das fehlt jetzt noch.
Es wäre doch denkbar, daß ich die Deine Gui nach unten durch eine Eingabezeile erweitere, ähnlich wie sie in meiner älteren Version enthalten ist. Ich schau mal, ob ich das hinbekomme. Wenn man für den gewünschten Bestand in der Tabelle oben nicht findet, könnte man diese dann darüber ergänzen.

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

Re: Optimierung Umbenennungstool

14 Feb 2019, 03:14

Hallo Meister Lampe!

zu 1.):
Ja.

zu 3.):
Es ist natürlich eine andere Situation, wenn das 'Umbenennen' nur Teil eines umfangreicheren Skripts ist. Das automatische Öffnen des Auswahlfensters beim Start ist dann nicht notwendig. Wenn es im SKript aber keine festen Vorgaben mehr gibt, muss die mnuelle Auswahl irgendwann nachgeholt werden, zumindest dann, wenn es noch keine abgespeicherte 'letzte Auswahl' gibt. Und wenn es eine 'letzte AUswahl' gibt, müssen damit die Vorgabewerte im Skript ermittelt werden.

zu 4.):
Dafür musst Du entweder das Fenster bei jedem Aufruf neu erstellen oder das Gui, Destroy durch Gui, Cancel ersetzen. Das Vorschaufenster braucht z.Zt. zumindest eine abgeschlossene Auswahl, weil sonst keine Vorgabewerte gespeichert sind.

zu 5.):
Das wäre dann die Situation, in der der Kollege die 'Standards' setzt, der als Erster glaubt, einen neuen Bestand eröffnen zu müssen. Ich halte das nach wie vor für keine gute Idee. Wenn ein neuer Bestand aufgemacht werden muss, sollten dessen Werte 'zentral' eingepflegt werden. Aber vielleicht ist das ja alles ncht so wichtig, wie ich denke.

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

Re: Optimierung Umbenennungstool

15 Feb 2019, 03:20

Hallo just me!
Wenn es im SKript aber keine festen Vorgaben mehr gibt, muss die manuelle Auswahl irgendwann nachgeholt werden, zumindest dann, wenn es noch keine abgespeicherte 'letzte Auswahl' gibt. Und wenn es eine 'letzte AUswahl' gibt, müssen damit die Vorgabewerte im Skript ermittelt werden.
Klar. Bisher hat man andere Werte als die Vorgabe über die Gui eingeben können, wenn auch nur temporär. Die sollen nun mit der Datei Bestandsvorgaben.txt festgehalten werden. Einen ersten Startwert könnte man dort ja auch schon vorgeben.
Ich habe jetzt mal den Codeschnipsel für die Eingabezeile aus meiner alten Gui etwas angepaßt und unter die ListView gesetzt:

Code: Select all

; Auswahlfenster erstellen
Rows := (L := Vorgaben.Length()) > 10 ? 10 : L
GuiText_1 := "Wählen Sie hier den Standard für das nächste Umbenennungsprojekt aus!"
Gui, Margin, 20, 20
Gui, Font, s10 , Verdana
Gui, Add, Text, xm w350, %GuiText_1%
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl, Bestand|Signatur|Index
For Each, Vorgabe In Vorgaben
{
   Felder := StrSplit(Vorgabe, "`t")
   Option := (Felder[1] = Auswahl) ? "Focus Select" : ""
   LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")

Gui, Add, Edit, cblue    xm  h25   w100  , %AktSign%
Gui, Add, Edit, cblue    x135  yp  h25  w70  , %SignVorlage%
Gui, Add, Edit, cblue    x220  yp  h25  w70  , %IndexVorlage%
Gui, Add, Text, x123     yp+5    h25   w15  , _
Gui, Add, Text, x210     yp    h25   w15  , -

Gui, Add, Button, xm  h30 w100 Default gAnwenden, Anwenden
Gui, Add, Button, x270 yp h30 w100 gAbbrechen, Abbrechen
Gosub, Auswahl
Return
Denkbar wäre jetzt, daß man evtl. Vorgabewerte dann wieder (wie bisher) in diese Vorschau- und Eingabezeile setzt und falls man sich oben in der Liste eine andere Einstellung auswählt, dann diese dort erscheint. Zweckmäßigerweise würde man dazu in der Auswahl.txt gleich alle drei Parameter speichern. Diejenigen wenigen, die berechtigt sind, neue Werte in die "zentrale Datei" Bestandsvorgaben.txt einzupflegen, könnten das dann ebenfalls über diese Zeile tun. Irgendwie muß das ja von dem Tool aus geschehen können. Ob man das direkt über den "Anwenden-Button" macht oder dazu noch einen weiteren für "Neue Vorlage speichern" setzt, kann man überlegen.

Ich habe bei der Beschreibung der Optionen für ListView im Tutorial gelesen, daß man mit dem Style LVS_SORTASCENDING die Liste automatisch sortieren kann. Wo und wie müßte ich das einfügen? Innerhalb der Loop-Schleife?

Code: Select all

For Each, Vorgabe In Vorgaben
{
   Felder := StrSplit(Vorgabe, "`t")
   Option := (Felder[1] = Auswahl) ? "Focus Select" : ""
   LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")
Ach ja, ob Destroy oder Cancel - irgendwie wird die Gui weiterhin nicht korrekt geschlossen. Nachher ist dann auch immer, wenn ich mit der rechten Maustaste das Script am Icon in der Taskleiste reloaden will, ein Häkchen bei "Suspend Hotkeys".

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

Re: Optimierung Umbenennungstool

15 Feb 2019, 04:06

Moin,

vielleicht denke ich ausnahmsweise mal etwas zu einfach.

Die 'Vorgabendatei' ist für mich eine einfache Textdatei, die in jeder Zeile drei durch Tab getrennte 'Felder' enthält:
  • Das erste Feld enthält einen 'Bestandsnamen' und kann in der Datei nur genau einmal vorkommen.
  • Das zweite Feld anthält eine Vorgabe (Muster) für einen 'Signaturteil' im neu zu bildenden Dateinamen.
  • Das dritte Feld enthält eine Vorgabe (Muster) für einen 'Indexteil' (lfd. Nummer) im neu zu bildenden Dateinamen.
Die 'Vorgabendatei' enthält immer nur eine überschaubare Anzahl von Sätzen. Deshalb kann sie von berechtigten Personen mit jedem beliebigen Editor gepflegt werden.

Die 'Auswahldatei' enthält die letzte Auswahl des Benutzers aus der Vorlagendatei. In dieser Datei ist nur der (eindeutige) 'Bestandname' abgelegt.

Wenn das Skript keine Vorgabe für den'Bestandsnamen' enthält und noch keine 'Auswahldatei' des Benutzers existiert (wie z.B. beim ersten Start des Skripts durch den Benutzer), muss eine Auswahl erzwungen werden, bevor die Routine für das Umbenennen abgearbeitet werden kann. Dafür gibt es verschiedene Optionen, wie z.B.
  • Es wird immer die erste Zeile der 'Vorgabendatei' genutzt.
  • Das Auswahlfenster wird beim Sart des Skripts angezeigt.
  • Das Auswahlfenster wird am Anfang der Routine für das Umbenennen angezeigt.

Zum Thema ListView:
Ich denke, Du meinst die ListView Option Sort

Zum Thema "Fenster schließen":
Das Häkchen bei "Suspend Hotkeys" kommt deher, dass in meiner Version vor Anzeige des Fensters ein Suspend, On steht. Suspend, Off gibt es aber nur bei Anwenden. Bei Abbrechen und GuiClose wurde es nicht gebraucht, weil die Anwendung beendet wurde.
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Optimierung Umbenennungstool

21 Feb 2019, 18:33

Hallo just me!

Ich habe jetztmal einiges probiert und ein paar Veränderungen unternommen. Dazu erst einmal der vollständige neue Code, in der sich unten anschließenden Erläuterungen dazu werde ich auch auf Deine Anregungen aus Deinem letzten Post eingehen.

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance force
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetTitleMatchMode, RegEx
SetBatchLines, -1

;------------------------------------------------------------------------
; Shell-Objekt erzeugen
ShellApp := ComObjCreate("Shell.Application")

;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
GroupAdd, Explorer, ahk_class ExploreWClass
GroupAdd, Explorer, ahk_class CabinetWClass

;------------------------------------------------------------------------
; Dateien
AuswahlDatei := A_ScriptDir . "\Auswahl.txt" ; A_AppData
VorgabenDatei := A_ScriptDir . "\Bestandsvorgaben.txt"

Auswahl := FileExist(AuswahlDatei) ? FileOpen(AuswahlDatei, "r").Read() : ""
If !(File := FileOpen(VorgabenDatei, "r")){
   MsgBox, 16, Fehler!, Die Datei %VorgabenDatei% konnte nicht geöffnet werden!
;   ExitApp
}
Vorgaben := StrSplit(File.Read(), "`n", "`r")
File.Close()

;------------------------------------------------------------------------

; Auswahlfenster erstellen
F8::
Rows := (L := Vorgaben.Length()) > 10 ? 10 : L
GuiText_1 := "Wählen Sie hier den Standard für das nächste Umbenennungsprojekt aus!"
Gui, Margin, 20, 20
Gui, Font, s10 , Verdana
Gui, Add, Text, xm w350, %GuiText_1%
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl Sort, Bestand|Signatur|Index
For Each, Vorgabe In Vorgaben
{
   Felder := StrSplit(Vorgabe, "`t")
   Option := (Felder[1] = Auswahl) ? "Focus Select" : ""
   LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")

Gui, Add, Edit, cblue    xm  h25   w100  , %Auswahl%
Gui, Add, Edit, cblue    x135  yp  h25  w70  , %SignVorlage%
Gui, Add, Edit, cblue    x220  yp  h25  w70  , %IndexVorlage%
Gui, Add, Text, x123     yp+5    h25   w15  , _
Gui, Add, Text, x210     yp    h25   w15  , -

Gui, Add, Button, xm  h30 w100 Default gAnwenden, Anwenden
Gui, Add, Button, x145 yp h30 w100 gNeuerstellen, Neu Erstellen
Gui, Add, Button, x270 yp h30 w100 gAbbrechen, Abbrechen
/*
Gosub, Auswahl
Return

;------------------------------------------------------------------------
; Auswahlfenster anzeigen
F8::
Auswahl:
*/
Menu, Tray, Icon, , , 1
;Suspend, On
GuiControl, Focus, BestandAuswahl
Gui, Show, x100 y100, Signierungsvorlagen
Return

;------------------------------------------------------------------------
; Auswahl übernehmen
Anwenden:
If !(Row := LV_GetNext())
{
   MsgBox, 16, Fehler!, Bitte wählen Sie einen Bestand aus!
   GuiControl, Focus, BestandAuswahl
   Return
}
LV_GetText(AktSign, Row, 1)
LV_GetText(SignVorlage, Row, 2)
LV_GetText(IndexVorlage, Row, 3)
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
; hier müßte wohl auch die externe Abspeicherung stattfinden!
If (AktSign <> Auswahl)
{
   Auswahl := AktSign
   File := FileOpen(AuswahlDatei, "w")
   File.Write(Auswahl)
   File.Close()
}
Gui, Cancel
Gosub, Anzeige
;Suspend, Off
Menu, Tray, Icon, , , 0
Return

;------------------------------------------------------------------------
; Neue Vorlage abspeichern
Neuerstellen:
Gui, Cancel
MsgBox, Ihre neu erstellte Vorlage wurde abgespeichert.
return
;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Cancel
;ExitApp
return
;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F8::
Anzeige:
VorschauSign := Format("{:0" . StellenSign . "}", 1)
VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
Progress, m2 fs12 zh0 ct0000ff CWffffff, %VorschauMsg%, , Vorschau, Verdana
SetTimer, ProgressOff, 2000
Return

ProgressOff:
Progress, Off
Return

;------------------------------------------------------------------------
; Bilder umbenennen im Windows Explorer
#IfWinActive ahk_group Explorer

<!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%
   ; 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
   }
   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 := ""
Return

#If ; Ende des bedingten HotKey
;------------------------------------------------------------------------
; Beenden des Scriptes
Escape::
ExitApp
Return
1.) Ich habe die sort-Option für die ListView eingefügt, das klappt prima.
2.) Ich habe jetzt alle Gui, Destroy durch Gui, Cancel, ersetzt, jetzt kann ich die Gui auch beim laufenden Script wieder aufrufen.
3.) Ich habe die Suspend-Befehle auskommentiert und merke keinen Unterschied. Ich weiß nicht, was die bewirken sollten.
4.) Ich habe die Gui erweitert um die bereits in meinem letzten Post angedeutete Eingabezeile, wie sie in der alten auch war und dafür gesorgt, daß der letzte Bestandsname ("AktSign" bzw. "Auswahl") gleich mit angezeigt wird. Bei den anderen Werten geht das ja noch nicht, weil sie in der Auswahl.txt ja nicht mit abgespeichert werden. Aber auch hier wird der Wert nur erneuert, wenn ich das Script reloade. Also selbst wenn in der Auswahl-Datei bereits etwas anderes steht, wird noch der Wert angezeigt.
5.) Ich habe einen weiteren Button eingefügt, dem ich den Namen "Neu erstellen" gegeben habe. Dahinter steht vorerst nur eine MsgBox, später soll dann darüber das Abspeichern von neuen Datensätzen für Vorlagen ausgelöst werden. Es ist immernoch am einfachsten, wenn die berechtigten Personen das direkt über das AHK-Tool erledigen können. Dann muß die Vorlagendatei nicht jedesmal dazu in unserem Netz gesucht separat geöffnet werden und es bedarf u.a. auch keiner weiteren genaueren Anleitung durch mich.
6.) Ich habe die beiden Module "Auswahlfenster erstellen" und "Auswahlfenster anzeigen" zusammengezogen, indem ich am Ende des einen das Gosub, Auswahl und am Anfang des anderen Auswahl: auskommentiert habe und den Hotkey F8 ganz oben an die Erstellung der Gui gesetzt habe. Neu ist dadurch:
a) Die Gui erscheint nicht mehr automatisch beim Start oder Reload des Scripts. Das war ja auch so gewollt.
b) Beim ersten Drücken von F8 öffnet sich auch wie vorgesehen das Fenster zur Auswahl mit der sortierten Liste.
c) Möchte ich die Gui aber ein weiteres Mal aufrufen, kommt jedesmal die Fehlermeldung
"Error: The same variable cannot be used for more than one control.
Specifically: vBestandAuswahl Sort"
mit Verweis (Pfeilchen) auf die Zeile mit dem Code

Code: Select all

Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl Sort, Bestand|Signatur|Index
an dieser Zeile habe ich aber gar nichts verändert! Und hier ist auch keine Variable, die ich doppelt eingesetzt hätte.
Ich habe keine Ahnung, was das zu bedeuten hat.

Du schlägst u.a. vor:
Das Auswahlfenster wird am Anfang der Routine für das Umbenennen angezeigt.
Im Prinzip ist das ja so vorgesehen. Wenn man was umzubenennen hat, holt man sich mit F8 die Auswahl und sucht sich für den aktuellen Bestand die Vorgaben aus.

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

Re: Optimierung Umbenennungstool

22 Feb 2019, 04:38

Moin Meister Lampe,

manchmal empfiehlt es sich, die Dinge Schritt für Schritt umzusetzen und auch durchzutesten. Die Änderungen zu 2.) und 6.) z.B. sind teilweise widersprüchlich. Wenn Du das Fenster nicht mehr mit Gui, Destroy zerstörst, kannst Du es anschließend bei F8:: auch nur bedingt wieder neu erstellen. Steuerelemente mit zugewiesenen Variablen führen dann z.B. zu dem von Dir beschriebenen Fehler, weil es ja im Fenster schon/noch ein Steuerelement mit diesem Namen gibt. Und das ist nun mal verboten. Wenn Du also das Fenster bei jeder Anzeige neu ersstellen willst, solltest Du es nach der Anzeige zerstören. Notfalls reicht auch ein Gui, Destroy als erste Gui-Anweisung in der F8:: Routine.

Zu 3.):
Die Suspend Anweisungen sollten nur verhindern, dass jemand während der Anzeige des Auswahlfensters andere Aktionen über Hotkeys auslöst.

zu 4.):
a)
... Bei den anderen Werten geht das ja noch nicht, weil sie in der Auswahl.txt ja nicht mit abgespeichert werden.
Die anderen Werte braucht man nicht in der Auswahl.txt abzuspeichern, weil sie durch die Vorgabendatei bestimmt werden. In der Auswahldatei darf nie ein Wert stehen, der nicht einem Eintrag in der Vorgabendatei entspricht. Die Werte sollten deshalb immer aus der Vorgabendatei bzw. der ausgewählten Zeile im ListView geholt werden.
b)
... Aber auch hier wird der Wert nur erneuert, wenn ich das Script reloade.
Ich verstehe nicht, was da wann 'erneuert' werden sollte.

zu 5.):
... Es ist immernoch am einfachsten, wenn die berechtigten Personen das direkt über das AHK-Tool erledigen können. Dann muß die Vorlagendatei nicht jedesmal dazu in unserem Netz gesucht separat geöffnet werden und es bedarf u.a. auch keiner weiteren genaueren Anleitung durch mich.
Da bin ich immernoch anderer Meinung. ;)

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

Re: Optimierung Umbenennungstool

05 Mar 2019, 18:01

Hallo just me!

Ich habe das Script jetzt nochmals etwas verändert bzw. etwas umgestellt, womit ich die Probleme, die ich Dir im letzten Post unter Punkt 4.) aufgeführt hatte, beseitigen konnte.

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance force
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
SetTitleMatchMode, RegEx
SetBatchLines, -1

;------------------------------------------------------------------------
; Shell-Objekt erzeugen
ShellApp := ComObjCreate("Shell.Application")

;------------------------------------------------------------------------
; Gruppe Windows Explorer Fenster definieren
GroupAdd, Explorer, ahk_class ExploreWClass
GroupAdd, Explorer, ahk_class CabinetWClass

;------------------------------------------------------------------------
; Vorlagendateien zum Abspeichern definieren
AuswahlDatei := A_ScriptDir . "\Auswahl.txt"  ; zuletzt verwendeter Vorlagenname, lokal gespeichert
; Auflistung im Infranetordner des Archivs:
;VorgabenDatei := "Pfad ... \Bestandsvorgaben.txt"
; Auflistung zum Ausprobieren:
VorgabenDatei := A_ScriptDir . "\Bestandsvorgaben.txt"  

; Vorlagen und Auswahlen aufrufen und einlesen
F8::
Auswahl := FileExist(AuswahlDatei) ? FileOpen(AuswahlDatei, "r").Read() : ""
If !(File := FileOpen(VorgabenDatei, "r")){
   MsgBox, 16, Fehler!, Die Datei %VorgabenDatei% konnte nicht geöffnet werden!
;   ExitApp
}
Vorgaben := StrSplit(File.Read(), "`n", "`r")
File.Close()

; Auswahlfenster erstellen und anzeigen
Rows := (L := Vorgaben.Length()) > 10 ? 10 : L
GuiText_1 := "Wählen Sie hier den Standard für das nächste Umbenennungsprojekt aus!"
Gui, Margin, 20, 20
Gui, Font, s10 , Verdana
Gui, Add, Text, xm w350, %GuiText_1%
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl Sort, Bestand|Signatur|Index
For Each, Vorgabe In Vorgaben
{
   Felder := StrSplit(Vorgabe, "`t")
   Option := (Felder[1] = Auswahl) ? "Focus Select" : ""
   LV_Add(Option, Felder*)
}
Loop, % LV_GetCount("Column")
   LV_ModifyCol(A_Index, "AutoHdr")

Gui, Add, Edit, cblue    xm  h25   w100  vAktSignNeu, %Auswahl%
Gui, Add, Edit, cblue    x135  yp  h25  w70  vSignVorlageNeu, %SignVorlage%
Gui, Add, Edit, cblue    x220  yp  h25  w70  vIndexVorlageNeu, %IndexVorlage%
Gui, Add, Text, x123     yp+5    h25   w15  , _
Gui, Add, Text, x210     yp    h25   w15  , -

Gui, Add, Button, xm  h30 w100 Default gAnwenden, Anwenden
; Button "Neu Erstellen"  wird in der Standardversion auskommentiert
Gui, Add, Button, x145 yp h30 w100 gNeuerstellen, Neu Erstellen
Gui, Add, Button, x270 yp h30 w100 gAbbrechen, Abbrechen

Menu, Tray, Icon, , , 1
GuiControl, Focus, BestandAuswahl
Gui, Show, x100 y100, Signierungsvorlagen
Return

;------------------------------------------------------------------------
; Auswahl übernehmen
Anwenden:
If !(Row := LV_GetNext())
{
   MsgBox, 16, Fehler!, Bitte wählen Sie einen Bestand aus!
   GuiControl, Focus, BestandAuswahl
   Return
}
LV_GetText(AktSign, Row, 1)
LV_GetText(SignVorlage, Row, 2)
LV_GetText(IndexVorlage, Row, 3)
StellenSign := StrLen(SignVorlage)
StellenIndex := StrLen(IndexVorlage)
LetzteSign := 0
; hier müßte wohl auch die externe Abspeicherung stattfinden!
If (AktSign <> Auswahl)
{
   Auswahl := AktSign
   File := FileOpen(AuswahlDatei, "w")
   File.Write(Auswahl)
   File.Close()
}
Gui, Destroy
Gosub, Anzeige
Menu, Tray, Icon, , , 0
Return

;------------------------------------------------------------------------
; Neue Vorlage abspeichern
Neuerstellen:
Gui, Destroy
MsgBox, Ihre neu erstellte Vorlage wurde abgespeichert.
return

;------------------------------------------------------------------------
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
return

;------------------------------------------------------------------------
; Vorschau mit Progresselement statt MsgBox, damit Schrift formatierbar ist
^F8::
Anzeige:
VorschauSign := Format("{:0" . StellenSign . "}", 1)
VorschauIndex := Format("{:0" . StellenIndex . "}", 0)
VorschauMsg = %AktSign%_%VorschauSign%-%VorschauIndex%
Progress, m2 fs12 zh0 ct0000ff CWffffff, %VorschauMsg%, , Vorschau, Verdana
SetTimer, ProgressOff, 2000
Return

ProgressOff:
Progress, Off
Return

;------------------------------------------------------------------------
; Bilder umbenennen im Windows Explorer
#IfWinActive ahk_group Explorer

<!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%
   ; 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
   }
   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 := ""
Return

#If ; Ende des bedingten HotKey
;------------------------------------------------------------------------
; Beenden des Scriptes
Escape::
ExitApp
Return
Der zweite Teil des Scriptes, der den eigentlichen Umbenennungsvorgang ausführt, ist weiterhin unverändert geblieben.
Ich habe jetzt die Auswahl der Dateien und Vorlagen mit dem Erstellen der Gui zusammengeführt, so wird immer die aktuelle Signatur angezeigt. Wenn ich sie während der Arbeit einmal geändert haben sollte, so stand bisher immernoch die alte in der aufgerufenen Gui.
Ich habe ebenso für diesen Fall beim Abspeichern der Werte noch LetzteSign := 0 hineingesetzt, damit fängt auch der Zählvorschlag beim Umsignieren immer wieder bei 1 an. In der Praxis wird es zwar kaum vorkommen, daß man schnell mal zwischen verschiedenen Standards hin und her wechselt - das tue ich eher jetzt beim Testen, aber sicher ist sicher.
Da bin ich immernoch anderer Meinung. ;)
Dieser Meinung bin ich auch! :)
Ich wüßte nur gerne, weshalb Du meinst, daß es einfacher wäre, die Vorlagendatei nicht über das AHK-Script zu verwalten. Rein von der technischen Machbarkeit her dürfte es doch keine Probleme geben, oder? Und durch das einfache Auskommentieren der einen Zeile, die den "Erstellen Button" generiert, hätte man im Handumdrehen die eingeschränkte Version für die "mormalen" Nutzer, die keine solchen Admin-Rechte haben sollen erstellt.

Viele Grüße von Meister Lampe

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: gero and 33 guests