Dateien eines bestimmten Zeitraums umbenennen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

festigrat
Posts: 54
Joined: 02 Mar 2017, 06:58

Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 05:21

Hallo,

an folgendem Problem beiße ich mir gerade die Zähne aus. Über Vorschläge wäre ich sehr dankbar.

Ich will Fotos, die in einem bestimmten Zeitraum entstanden sind, oder die folgendes Dateiformat haben (YYYYMMDD-HHMMSS.jpg) umbenennen.

Bevor ich mehrere Fotos von einem Gegenstand mache, starte ich ein AHK-Skript, bei dem ich eine Artikelnummer eingebe. Gleichzeitig wird in einer ini-Datei der Zeitstempel eingetragen.

Dann fotografiere ich munter los und wenn ich damit fertig bin, wird wieder ein Zeitstempel in der ini-Datei eingetragen.

Wenn ich schließlich mehrere Gegenstände fotografiert habe, habe ich die Zeiträume, in denen die einzelnen Fotos entstanden sind. Nun wäre es super, wenn ich z.B. die Fotos per AHK-Skript umbenennen könnte, so dass die eingegebene Artikelnummer vor den Dateinamen gestellt wird.

Über Lösungsvorschläge würde ich mich sehr freuen.

Liebe Grüße.
just me
Posts: 9456
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 08:08

Moin,

wenn die Zeiten synchron sind, sollte das kein Problem sein. Aus den Dateinamen im Format YYYYMMDD-HHMMSS.jpg lässt sich durch Entfernen der Dateiendung und des Bindestrichs ein schöner Zeitstempel erzeugen. Den kannst Du einfach mit den Start- und Endezeitstempeln aus der INI vergleichen:

Code: Select all

If (Dateizeitstempel >= Startzeitstempel) && (Dateizeitstempel <= Endezeitstempel) {
...
}
festigrat
Posts: 54
Joined: 02 Mar 2017, 06:58

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 09:50

Hey, vielen Dank. Das hat mich schon mal ein wenig weitergebracht, aber bei der Umsetzung tue ich mir noch sehr schwer, denn ich habe keine Lösung gefunden, was ich in die if-Klammer schreiben könnte. Agesehen davon hat AHK Probleme mit dem Auslesen des Dateinamens, jedenfalls wird bei mir angezeigt, dass die Variable (der Dateinamen mit dem Bindestrich in der Mitte) ein nicht gültiges Zeichen enthält. Ich habe es auch deswegen nicht den Bindestrich mit StringReplace wegbekommen.

Ich habe folgenden Lösungsansatz versucht, nachdem ich etwas über loop gelesen habe. Aber es funktioniert nicht. Die Datei wurde nicht umbenannt.

Code: Select all

loop, C:\Autohotkey\*.jpg
	{
	
	EnvSub, ZeitstempelEnde, %A_LoopFileTimeCreated%, seconds
	EnvSub, ZeitstempelStart, %A_LoopFileTimeCreated%, seconds
	
	
	if (ZeitstempelEnde >= 0 && ZeitstempelStart <=0)
		{
		FileMove, C:\Autohotkey\%A_LoopFileFullPath%.jpg, C:\Autohotkey\%Verkaufsnummer%%A_LoopFileFullPath%.jpg
		}
	}
Geht es überhaupt damit und wo könnte der Fehler liegen?

Viele Grüße!
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 10:06

festigrat wrote:Agesehen davon hat AHK Probleme mit dem Auslesen des Dateinamens, jedenfalls wird bei mir angezeigt, dass die Variable (der Dateinamen mit dem Bindestrich in der Mitte) ein nicht gültiges Zeichen enthält.
Wenn dieser Fehler bei dir kommt hast du mit fast 100% Wahrscheinlichkeit %% da benutzt wo es nicht hingehört.
Zudem sehe ich, dass du nie die Ini ausliest.
Du müsstest vorher also noch die Daten der Inis auslesen. Wie genau sieht deine/die Inis denn aus?
Recommends AHK Studio
festigrat
Posts: 54
Joined: 02 Mar 2017, 06:58

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 10:14

Hallo,

den Teil mit der Ini habe ich weggelassen. Hier das Auslesen der Ini:

Code: Select all

IniRead, ZeitstempelStart, Verkaufsnummer.ini, %Verkaufsnummer%, Zeitstempel-Start
IniRead, ZeitstempelEnde, Verkaufsnummer.ini, %Verkaufsnummer%, Zeitstempel-Ende
und hier die Ini-Datei:
  • [S0001]
    Verkaufsnummer=S0001
    Zeitstempel-Start=20170312102331
    Zeitstempel-Ende=20170312102354
    [V0001]
    Verkaufsnummer=V0001
    Zeitstempel-Start=20170311100000
    Zeitstempel-Ende=20170312143000
    [V0002]
    Verkaufsnummer=V0002
    Zeitstempel-Start=20170312125414
    Zeitstempel-Ende=20170312125438
Die Werte werden richtig ausgelesen. Das mit den % werde ich nochmal überprüfen. Jedenfalls komme ich dennoch nicht weiter, weder, was in den if-Teil gehört, noch, was bei dem Loop-Versuch falsch sein sollte. Über Ideen bin ich sehr dankbar.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 10:56

Bei dem FileMove sehe ich ein paar Fehler:
A_LoopFileFullPath enthält den ganzen Pfad zur aktuellen Datei also z.B.: "C:\Autohotkey\2017031-2102331.jpg".
Wenn du nun bei deinem FileMove noch ein "C:\AutoHotkey\" davor hängst und ein ".jpg" dranhängst versucht AutoHotkey die Datei "C:\AutoHotkey\C:\Autohotkey\2017031-2102331.jpg.jpg" zu verschieben die einfach nicht existiert.
Richtig würde es heißen:
FileMove, %A_LoopFileFullPath%, %A_LoopFileDir%%Versionsnummer%%A_LoopFileName%
Bei dem If kannst du die Variable direkt vergleichen anstatt zu subtrahieren und dann mit 0 zu vergleichen - dabei bleiben dir dann auch die Werte der Zeitstempel erhalten:
if (ZeitstempelEnde >= A_LoopFileTimeCreated && ZeitstempelStart <= A_LoopFileTimeCreated )
Recommends AHK Studio
just me
Posts: 9456
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 11:18

OK, erst einmal zum Inhalt der INI:
  • Der Wert des Keys Verkaufsnummer ist identisch mit dem Namen der Section -> überflüssig.
  • Solange es eindeutig bleibt, sollten m.E. die Keynamen kurz gehalten werden. Deshalb -> Start anstelle Zeitstempel-Start, aber das ist reine Geschmackssache.
Jetzt zum Einlesen der INI:
  • AHK bietet Dir die Möglichkeit, die Namen aller Sections in einem Rutsch einzulesen:

    Code: Select all

    IniRead, Sections, NamerDerIniDatei
    Jetzt stehen alle Sectionnamen getrennt durch einen Zeilenvorschub `n in Sections.
  • Jetzt solltest Du Dir für alle Sections die Werte für Start und Ende holen, damit Du das nicht für jede Datei wiederholen musst. Speichern kann man das recht gut in einem Assoziativen Array.

    Code: Select all

    IniDatei := NamerDerIniDatei
    IniRead, Sections, %IniDatei% 
    IniArray := {} ; neues leeres Array definieren
    Loop, Parse, Sections, `n
    {
       Section := A_LoopField
       IniRead, Start, %IniDatei%, %Section%, Start
       IniRead, Ende, %IniDatei%, %Section%, Ende
       IniArray[Section] := {Start: Start, Ende: Ende} ; dem Key Section wird ein assoziatives Array mit den Keys Start und Ende zugewiesen
    }
  • Um später auf die im Array gespeicherten Werte zuzugreifen, kannst Du eine For-Schleife nutzen:

    Code: Select all

    For Section, Zeit In IniArray
    {
       If (Dateizeitstempel >= Zeit.Start) && (Dateizeitstempel <= Zeit.Ende)
          ... ; der Name der Section steht in der Variablen Section
    }
Für den Rest siehe nnnik.
festigrat
Posts: 54
Joined: 02 Mar 2017, 06:58

Re: Dateien eines bestimmten Zeitraums umbenennen

12 Mar 2017, 11:41

Ihr Beiden,

herzlichen Dank für Eure Unterstützung! Jetzt gibt es endlich Licht am Ende des Tunnels. Das mit dem Assoziativen Array sieht spannend aus. Ich werde es mir mal in einer ruhigen Minute anschauen.

Ansonsten klappt das Skript prinzipiell. Nach dem Umbenennen der Fotos hatte das letzte Foto im Zeitraum immer am Anfang zweimal die Verkaufsnummer. Anscheinend hat das Skript diese Datei ein weiteres Mal umbenannt. Ich habe das Problem dadurch umgangen, dass ich die Fotos mit FileMove nicht nur umbenannt habe, sondern auch gleich an einen anderen Ort kopiert habe, womit ich gut leben kann.

Hier nochmal das fertige Skript. Ich habe mich noch anstatt A_LoopFileCreated für A_LoopFileTimeModified entschieden.

Code: Select all

	IniRead, ZeitstempelStart, Verkaufsnummer.ini, %Verkaufsnummer%, Zeitstempel-Start
	IniRead, ZeitstempelEnde, Verkaufsnummer.ini, %Verkaufsnummer%, Zeitstempel-Ende

	sleep, 500
	
	loop, C:\Autohotkey\*.jpg
	{
	
	if (ZeitstempelEnde >= A_LoopFileTimeModified && ZeitstempelStart <= A_LoopFileTimeModified)
	
		{
		FileMove, %A_LoopFileFullPath%, C:\Autohotkey\Fotos\%Verkaufsnummer%-%A_LoopFileName%
		}
	}

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 54 guests