Ich erhalte da nur den Fehler
Code: Select all
Ambiguous or invalid use of "."
Specifically: ...
Viele Grüße von Meister Lampe
Moderator: jNizM
Code: Select all
Ambiguous or invalid use of "."
Specifically: ...
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
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
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
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
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
Code: Select all
BestListe := A_ScriptDir . "\Signaturentabelle_AHK.csv" ; (oben)
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.ich denke, das sollten einzelne Einträge sein: ..
Ja, so war das gedacht. So hattest Du es ja auch bei Deinem Beispiel für die .ini-Datei gemacht.wenn ich das richtig verstehe,
[..]
enthält die Variable BestListe den Pfad und Namen einer CSV-Datei.
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
Was für eine Methode empfielst Du stattdessen?Man sollte deshalb nicht versuchen, mit IniRead/IniWrite auf CSV-Dateien zuzugreifen.
Code: Select all
SektName AktSign StellenSign StellenIndex
B 727--1 B 727--1 4 4
B 180--2 B 180--2 6 3
Code: Select all
[B 727--1]
StellenSign=4
StellenIndex=4
[D 180--2]
StellenSign=6
StellenIndex=3
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 CodezeileDein Dateibeispiel wirkt auf mich recht ungewöhnlich. Normalerweise würde ich mir eine aus Excel erstellte CSV-Datei eher so vorstellen...
Code: Select all
IniWrite, %Sektname% %AktSign% %StellenSign% %StellenIndex%, %BestListe%, %SektName%, SektName
Ich hatte mir Folgendes vorgestellt: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?
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.
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
Code: Select all
Gui,1: Add, Edit, cblue x20 y90 h25 w100 vBestandAuswahl, %AktSign%
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.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.
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.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.
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.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.
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
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
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.Die per InputBox möglichen Änderungen werden für die Vorgaben derzeit nicht berücksichtigt.
Code: Select all
:*:sgh::Sehr geehrter Herr {!}{left}
Code: Select all
; Auswahl abbrechen -> Programm beenden
Abbrechen:
GuiClose:
Gui, Destroy
;ExitApp
return
Ja, das fehlt jetzt noch.Ein schreibender Zugriff aus dem Skript heraus ist nicht vorgesehen.
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.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.
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
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")
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
mit Verweis (Pfeilchen) auf die Zeile mit dem Code"Error: The same variable cannot be used for more than one control.
Specifically: vBestandAuswahl Sort"
Code: Select all
Gui, Add, ListView, xm wp r%Rows% -Multi vBestandAuswahl Sort, Bestand|Signatur|Index
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.Das Auswahlfenster wird am Anfang der Routine für das Umbenennen angezeigt.
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.... Bei den anderen Werten geht das ja noch nicht, weil sie in der Auswahl.txt ja nicht mit abgespeichert werden.
Ich verstehe nicht, was da wann 'erneuert' werden sollte.... Aber auch hier wird der Wert nur erneuert, wenn ich das Script reloade.
Da bin ich immernoch anderer Meinung.... 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.
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
Dieser Meinung bin ich auch!Da bin ich immernoch anderer Meinung.