Manipulate data in variable for 30.000 filenames

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
ZhanToO
Posts: 8
Joined: 15 Dec 2016, 03:44

Manipulate data in variable for 30.000 filenames

Post by ZhanToO » 10 Aug 2022, 14:02

Hi!

Firstly a quick explanation of what I am trying to accomplish.

We have 30.000 photos, and I am trying to convert them & all incoming future photos to a different file type, resize them and add a watermark while keeping the original.

So far I have a script I found online that can sync all photos between 2 folders so that the original is kept. the sync works by comparing the filename and the timestamp.

the sync script copies the file exactly, so keeps the original time stamp - so if I edit the original photo and the timestamp thereby changes, those changes are synced.

After the sync, I have a script that throws a command into CMD, activating some software called ImageMagick, that does all the photo manipulation in the background.

However, the issue is that when ImageMagick has done its... Magic, the file has then changed it's timestamp - and since there is a filetype change, and to separate the unprocessed photos from the processed, they also have a change of filename (from photo.jpg to photo_watermark.webp)

But when I want to combine the script into one, that can do all of the actions (preferably to run hourly or daily), I cannot wrap my head around how to do it.

I need to reinstate the original timestamp (I can use FileSetTime) - but I somehow have to have the script take the timestamp from photo.jpg and have it used on photo_watermark.webp

Also the sync script, I have to tell it that photo.jpg is the same file as photo_watermark.webp - I assume I can do something here with stringreplace



Can someone help a fellow about to give up? 😂


Code pasted below:


Image manipulation:

Code: Select all

myFolder :=""
FileSelectFolder, myFolder ; prompt to selct a folder, save it as myFolder

Loop, Files, %myFolder%\*.jpg ; this will only loop thru the non watermarked files
{
    Run cmd.exe /c magick composite -tile C:\Users\kpe\Desktop\Herfra\watermark_white.png -resize 50`% C:\Users\kpe\Desktop\Herfra\%A_LoopFileName% C:\Users\kpe\Desktop\Hertil\%A_LoopFileName%_watermark.webp ;runs CMD and has imagemagick add a watermark, resize the photo and convert it to webp
}
Photo sync:

Code: Select all

; supersynchronizer
; :: SuperSynchronizer, a little script for incremental/mirror directory backup.
; ----------------------------------
; cyrusza - http://ciroprincipe.info
; --
; :: Set the source and destination directory, set copy mode and let the script work.
; :: To exclude files from the replication or reverse check, add them to the exclusion lists.
; ----------------------------------
; --

#SingleInstance force

; SOURCE/DESTINATION DIRECTORIES
; ***************************************************************
;
; Change these values for source and destination directories.
;
; Rules:
; ------
; [absolute path]
; [no quotes]
;
; Examples:
; ---------
; SS_sourceDir = C:\a_dir\a_subdir\a_source_subdir
;
; SS_destDir = C:\a_dir\a_subdir\a_destination_subdir
;
; ---------------------------------------------------------------

SS_sourceDir = G:\Billeder\Nye

SS_destDir = C:\Users\kpe\Desktop\Her til

; MIRRORING
; ***************************************************************
;
; Change this to "y" for directory mirroring or to "n" for 
; incremental copy without mirroring.
;
; ---------------------------------------------------------------

SS_isMirror = y


; REPLICATION CHECK GLOBAL EXCLUSIONS
; THESE ITEMS WILL NOT BE COPIED ON DESTINATION SIDE
; ***************************************************************
;
; Add source items (absolute path or relative name) to exclude 
; them from the replication check. These items will not be 
; created on destination side.
;
; Rules:
; ------
; [continuation section]
; [newline separated]
; [no quotes]
; [surrounded by <>]
;
; Examples:
; ---------
; SS_exReplicationXXX =
; ( LTrim
; <C:\a_source_dir\a_source_item>
; )
;
; SS_exReplicationXXXRel =
; ( LTrim
; <a_source_item>
; )
;
; ---------------------------------------------------------------

; Excluded directories (absolute path)
SS_exReplicationDirs =
( LTrim
)

; Excluded directories (relative name)
SS_exReplicationDirsRel =
( LTrim
)

; Excluded files (absolute path)
SS_exReplicationFiles =
( LTrim
)

; Excluded files (relative name)
SS_exReplicationFilesRel =
( LTrim
)


; REVERSE CHECK GLOBAL EXCLUSIONS
; THESE ITEMS WILL NOT BE DELETED ON DESTINATION SIDE
; ***************************************************************
;
; Add destination items (absolute path or relative name) to 
; exclude them from the reverse check. These items will not be 
; deleted on destination side.
;
; Rules:
; ------
; [continuation section]
; [newline separated]
; [no quotes]
; [surrounded by <>]
;
; Examples:
; ---------
; SS_exReverseXXX =
; ( LTrim
; <C:\a_destination_dir\a_destination_item>
; )
;
; SS_exReverseXXXRel =
; ( LTrim
; <a_destination_item>
; )
;
; ---------------------------------------------------------------

; Excluded directories (absolute path)
SS_exReverseDirs =
( LTrim
)

; Excluded directories (relative name)
SS_exReverseDirsRel =
( LTrim
)

; Excluded files (absolute path)
SS_exReverseFiles =
( LTrim
)

; Excluded files (relative name)
SS_exReverseFilesRel =
( LTrim
)


; PROGRAM INITIALIZING
; ***************************************************************
;
; Gui creation, routines start and log management.
;
; ---------------------------------------------------------------

; Gui management
Gui, 11:Add, Text, vSS_syncText Left w200, Synchronizing...
Gui, 11:Add, Button, gSS_exitLabel vSS_syncButton w50 h20 x+10, &Close
Gui, 11:-Caption +Border
Gui, 11:Show, Center Autosize, SuperSynchronizer

; Log management
VarSetCapacity(SS_logData, 10240000) ; 10MB
SS_logData = [%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - REPLICATION CHECK STARTED`n******************************************************************************`n

; Core logic
SetWorkingDir, %SS_sourceDir%
SS_ReplicationCheckRecursive("*.*")
If SS_isMirror = y
{
	; Log management
	SS_logData = %SS_logData%`n[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - REVERSE CHECK STARTED`n******************************************************************************`n

	SetWorkingDir, %SS_destDir%
	SS_ReverseCheckRecursive("*.*")
}
SetWorkingDir, %A_ScriptDir%

; Log management
SS_logData = %SS_logData%`n------------------------------------------------------------------------------`n`n
FileAppend, %SS_logData%, %A_ScriptDir%\SS_log.txt

; Gui management
Gui, 11:Cancel
GuiControl, 11:, SS_syncText, DONE!
GuiControl, 11:, SS_syncButton, &Ok
GuiControl, 11:+Default, SS_syncButton
Gui, 11:Show, Center Autosize, SuperSynchronizer

Return

; Exit label
SS_exitLabel:
Gui, 11:Destroy
ExitApp


; REPLICATION CHECK ROUTINE
; ***************************************************************
;
; This function implements the replication check, where the 
; source items are replicated on destination side (the function 
; is recursive).
;
; ---------------------------------------------------------------

SS_ReplicationCheckRecursive(SS_aPattern)
{
	Global SS_sourceDir, SS_destDir, SS_exReplicationDirs, SS_exReplicationDirsRel, SS_exReplicationFiles, SS_exReplicationFilesRel, SS_logData

	Loop, %SS_aPattern%, 1
	{
		FileGetAttrib, SS_checkPattern, %A_LoopFileFullPath%
		; It's a directory
		IfInString, SS_checkPattern, D
		{
			; If directory isn't in exlusion lists
			If (NOT InStr(SS_exReplicationDirs, "<" . A_LoopFileLongPath . ">")) AND (NOT InStr(SS_exReplicationDirsRel, "<" . A_LoopFileName . ">"))
			{
				; Checks if source directory exists as destination directory, if not it creates it
				IfNotExist, %SS_destDir%\%A_LoopFileFullPath%
				{
					FileCreateDir, %SS_destDir%\%A_LoopFileFullPath%
					; Log management
					If ErrorLevel
					{
						SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - ERROR >> Could not create directory: "%SS_destDir%\%A_LoopFileFullPath%" #`n
					}
					Else
					{
						SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SUCCESS >> Directory created: "%SS_destDir%\%A_LoopFileFullPath%" #`n
					}
				}
				; Recursion into current directory
				SS_ReplicationCheckRecursive(A_LoopFileFullPath . "\*.*")
			}
			; Directory skipped
			Else
			{
				; Log management
				SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SKIPPED >> Directory excluded: "%A_LoopFileLongPath%" #`n
			}

		}
		; It's a file
		Else
		{
			SS_copyItFlag = n
			; If file isn't in exlusion lists
			If (NOT InStr(SS_exReplicationFiles, "<" . A_LoopFileLongPath . ">")) AND (NOT InStr(SS_exReplicationFilesRel, "<" . A_LoopFileName . ">"))
			{
				; Checks if file exists in destination directory, if not sets copy flag
				IfNotExist, %SS_destDir%\%A_LoopFileFullPath%
				{
					SS_copyItFlag = y
				}
				Else
				{
					; Checks if source file is more recent than destination file, if yes sets copy flag
					FileGetTime, SS_time, %SS_destDir%\%A_LoopFileFullPath%
					EnvSub, SS_time, %A_LoopFileTimeModified%, seconds
					If SS_time < 0
					{
						SS_copyItFlag = y
					}
				}
			}
			; File skipped
			Else
			{
				; Log management
				SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SKIPPED >> File excluded: "%A_LoopFileLongPath%" #`n
			}
			; Copies file
			If SS_copyItFlag = y
			{
				SS_destFileLongPath = %SS_destDir%\%A_LoopFileFullPath%
				FileCopy, %A_LoopFileLongPath%, %SS_destFileLongPath%, 1
				; Log management
				If ErrorLevel
				{
					SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - ERROR >> Error copying "%A_LoopFileLongPath%" to "%SS_destFileLongPath%" #`n
				}
				Else
				{
					SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SUCCESS >> Copied "%A_LoopFileLongPath%" to "%SS_destFileLongPath%" #`n
				}
			}
		}
	}
	Return 0
}


; REPLICATION CHECK ROUTINE
; ***************************************************************
;
; This function implements the reverse check, where the 
; destination side is analyzed and eventually modified to create 
; a mirror copy of the source (the function is recursive).
;
; ---------------------------------------------------------------

SS_ReverseCheckRecursive(SS_aPattern)
{
	Global SS_sourceDir, SS_destDir, SS_exReverseDirs, SS_exReverseDirsRel, SS_exReverseFiles, SS_exReverseFilesRel, SS_logData

	Loop, %SS_aPattern%, 1
	{
		FileGetAttrib, SS_checkPattern, %A_LoopFileFullPath%
		; It's a directory
		IfInString, SS_checkPattern, D
		{
			; If directory doesn't exist on source side
			IfNotExist, %SS_sourceDir%\%A_LoopFileFullPath%
			{
				; If directory isn't in exlusion lists
				If (NOT InStr(SS_exReverseDirs, "<" . A_LoopFileLongPath . ">")) AND (NOT InStr(SS_exReverseDirsRel, "<" . A_LoopFileName . ">"))
				{
					; Backup flag (to restore the dontDeleteDirFlag if next recursion sets the flag to 0 and it was 1)
					; Eg: the item is a directory that can be deleted
					SS_oldFlag = SS_dontDeleteDirFlag
					; Recurses and obtains a new flag
					SS_dontDeleteDirFlag := SS_ReverseCheckRecursive(A_LoopFileFullPath . "\*.*")
					If SS_dontDeleteDirFlag != 1
					{
						FileRemoveDir, %A_LoopFileFullPath%, 1
						; Log management
						If ErrorLevel
						{
							SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - ERROR >> Could not delete directory: "%A_LoopFileLongPath%" #`n
						}
						Else
						{
							SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SUCCESS >> Directory removed: "%A_LoopFileLongPath%" #`n
						}
						; Restores flag
						If SS_oldFlag = 1
						{
							SS_dontDeleteDirFlag = 1
						}
					}
					; Directory skipped
					Else
					{
						; Log management
						SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SKIPPED >> Directory excluded because of file dependancy: "%A_LoopFileLongPath%" #`n
					}
				}
				; Directory skipped
				Else
				{
					SS_dontDeleteDirFlag = 1
					; Log management
					SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SKIPPED >> Directory excluded: "%A_LoopFileLongPath%" #`n
				}
			}
			; If directory exists in source side
			Else
			{
				SS_ReverseCheckRecursive(A_LoopFileFullPath . "\*.*")
			}
		}
		; It's a file
		Else
		{
			; If file doesn't exist on source side
			IfNotExist, %SS_sourceDir%\%A_LoopFileFullPath%
			{
				; If file isn't in exclusion lists
				If (NOT InStr(SS_exReverseFiles, "<" . A_LoopFileLongPath . ">")) AND (NOT InStr(SS_exReverseFilesRel, "<" . A_LoopFileName . ">"))
				{
					FileDelete, %A_LoopFileFullPath%
					; Log management
					If ErrorLevel
					{
						SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - ERROR >> Could not delete "%A_LoopFileLongPath%" #`n
					}
					Else
					{
						SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SUCCESS >> File deleted: "%A_LoopFileLongPath%" #`n
					}
				}
				; The file is skipped for exclusion, to keep it on destination side, sets the SS_dontDeleteDirFlag
				Else
				{
					SS_dontDeleteDirFlag = 1
					; Log management
					SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SKIPPED >> File excluded: "%A_LoopFileLongPath%" #`n
				}
			}
			; If file exist on source side
			Else
			{
				; If file isn't in exclusion lists
				If (NOT InStr(SS_exReverseFiles, "<" . A_LoopFileLongPath . ">")) AND (NOT InStr(SS_exReverseFilesRel, "<" . A_LoopFileName . ">"))
				{
					; Checks if destination file differs from source file, if yes overwrites destination file with source file
					FileGetTime, SS_time, %SS_sourceDir%\%A_LoopFileFullPath%
					EnvSub, SS_time, %A_LoopFileTimeModified%, seconds
					If SS_time != 0
					{
						; Copies file from source to destination
						SS_sourceFileLongPath = %SS_sourceDir%\%A_LoopFileFullPath%
						FileCopy, %SS_sourceFileLongPath%, %A_LoopFileLongPath%, 1
						; Log management
						If ErrorLevel
						{
							SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - ERROR >> Error copying "%SS_sourceFileLongPath%" to "%A_LoopFileLongPath%" #`n
						}
						Else
						{
							SS_logData = %SS_logData%[%A_YYYY%/%A_MM%/%A_DD%]%A_Hour%:%A_Min%:%A_Sec% - SUCCESS >> Copied "%SS_sourceFileLongPath%" to "%A_LoopFileLongPath%" #`n
						}

					}
				}
			}
		}
	}
	Return SS_dontDeleteDirFlag
}

User avatar
flyingDman
Posts: 2791
Joined: 29 Sep 2013, 19:01

Re: Manipulate data in variable for 30.000 filenames

Post by flyingDman » 10 Aug 2022, 14:39

but I somehow have to have the script take the timestamp from photo.jpg
use any of these:
A_LoopFileTimeModified The time the file was last modified. Format YYYYMMDDHH24MISS.
A_LoopFileTimeCreated The time the file was created. Format YYYYMMDDHH24MISS.
A_LoopFileTimeAccessed The time the file was last accessed. Format YYYYMMDDHH24MISS.

see here: https://www.autohotkey.com/docs/commands/LoopFile.htm#Special_Variables
14.3 & 1.3.7

ZhanToO
Posts: 8
Joined: 15 Dec 2016, 03:44

Re: Manipulate data in variable for 30.000 filenames

Post by ZhanToO » 11 Aug 2022, 02:43

Hi

Thank you for taking the time to reply and help me out.

The problem is not knowing what to use, but how to put it together.

Since the conversion changes the filename from file1.jpg to file1.jpg_watermark.webp - I need it to somehow know which timestamp belongs to which file.


Using

Code: Select all

FileSetTime, %A_LoopFileTimeModified%, %A_LoopFileName%_watermark.webp, M
does not work.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Manipulate data in variable for 30.000 filenames

Post by BoBo » 11 Aug 2022, 03:11

Code: Select all

srcPath	 := "c:\myFolder\scr"
destPath := "c:\myFolder\dest"

Loop, Files,% srcPath
	FileSetTime, A_LoopFileTimeModified,% destPath "\" . SubStr(A_LoopFileName, 1, -4) . "_watermark.webp", M
That should take the "modified time" from the srcPath-file and adds it to the file of the same name but within destPath. Please create a test environment! Use it at your own risk :mrgreen:

BTw...
FileSetTime / Parameters
YYYYMMDDHH24MISS
[...]
This parameter is an expression.
... therefore variables have to be used expression-style AKA without %...%

ZhanToO
Posts: 8
Joined: 15 Dec 2016, 03:44

Re: Manipulate data in variable for 30.000 filenames

Post by ZhanToO » 11 Aug 2022, 08:11

Uhh, I took the chance without a test system, but it doesn't seem to work - the files just have the real actual modified time & date.

Code: Select all

myFolder :=""
FileSelectFolder, myFolder ; prompt to selct a folder, save it as myFolder

Loop, Files, %myFolder%\*.jpg ; this will only loop thru the non watermarked files
{
    Runwait cmd.exe /c magick composite -gravity center -dissolve 30 C:\Users\kpe\Desktop\Herfra\InsideLogoblaagennemsigtigbaggrund.png -resize 50`% C:\Users\kpe\Desktop\Herfra\%A_LoopFileName% C:\Users\kpe\Desktop\Hertil\%A_LoopFileName%_watermark.webp ;runs CMD and has imagemagick add a watermark, resize the photo and convert it to webp
}

srcPath	 := "C:\Users\kpe\Desktop\Herfra"
destPath := "C:\Users\kpe\Desktop\Hertil"

Loop, Files,% srcPath
	FileSetTime, A_LoopFileTimeModified,% destPath "\" . SubStr(A_LoopFileName, 1, -4) . "_watermark.webp", M

Return

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Manipulate data in variable for 30.000 filenames

Post by BoBo » 11 Aug 2022, 10:42

Correct me if I'm wrong, but your use of %A_LoopFilename% within the cmd line should create a filename like "blabla.jpg_watermark.webp"
While this setting…

% destPath "\" . SubStr(A_LoopFileName, 1, -4) . "_watermark.webp"

…should create a filename like this: "blabla_watermark.webp". What gives me the idea that you've tried to FileSetTime non existing files afterwards… :think:

And hey, do yourself a favor and create two dummy folders with a few cloned input files for testing. You don't wanna end up with a ton of ill-processed files just bc of being a bit lazy. Good luck ;)

ZhanToO
Posts: 8
Joined: 15 Dec 2016, 03:44

Re: Manipulate data in variable for 30.000 filenames

Post by ZhanToO » 11 Aug 2022, 13:58

Could be :D

I have dummy folders already - hertil and herfra mean from here and here to in my local language.

Else if all else fails I am considering sticking to keeping them as .jpg - not all browsers support .webp anyways.



And then doing it like this instead:

1 folder with the originals

1 folder with a copy of the originals

1 folder whit the downsized watermarked files

Saving the last run date of the manipulation script & then only manipulating any files added after the last date.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Manipulate data in variable for 30.000 filenames

Post by BoBo » 12 Aug 2022, 01:21

@ZhanToO - so, as said before, you ignore your own statement/requirement…
… they also have a change of filename (from photo.jpg to photo_watermark.webp)
…as A_LoopName contains the files extension that will result in 'photo.exe_watermark.webp' instead.

Code: Select all


srcPath	 := "C:\Users\kpe\Desktop\Herfra"
destPath := "C:\Users\kpe\Desktop\Hertil"

myFolder :=""
FileSelectFolder, myFolder ;prompt to select a folder, save it as myFolder

Loop, Files, % myFolder "\*.jpg" ;this will only loop thru the non watermarked files
    Runwait % comspec " /c magick composite -gravity center -dissolve 30 " srcPath "\InsideLogoblaagennemsigtigbaggrund.png -resize 50 % " destPath "\" . SubStr(A_LoopFileName, 1, -4) . "_watermark.webp" ;runs CMD and has imagemagick add a watermark, resize the photo and convert it to webp

Loop, Files,% srcPath "\*.jpg"
	FileSetTime, A_LoopFileTimeModified,% destPath "\" . SubStr(A_LoopFileName, 1, -4) . "_watermark.webp", M

Return
This should do it (not tested)

:) Yep, your language looks like Skandinavian? :think:

That mixture of German and English…
Hertil = here,hier (un)til
Herfra = here,hier fr[a|o]m

InsideLogoblaagennemsigtigbaggrund…
Inside = Innenseite
Logo = Logo
blaa = ?
gennemsigtig = genehmigt
baggrund = background :mrgreen:

ZhanToO
Posts: 8
Joined: 15 Dec 2016, 03:44

Re: Manipulate data in variable for 30.000 filenames

Post by ZhanToO » 12 Aug 2022, 02:30

Danish :) Are you German, or just speak the language?

Ohh, I am not ignoring it on purpose, just way over my head :)
Will try your work!

You're close to correct!
We have.. not sure how to say it.. reverse wording position on some things?
So when we write "here till" it would be more correct to translate it into to here - and herfra would to from here

Hertil = here till / to here
Herfra = here,hier fr[a|o]m

InsideLogoblaagennemsigtigbaggrund… = Inside (partial company name) logo blue seethrough background
Inside = Innenseite (partial company name, so actually just plain English)
Logo = Logo
blaa = ? Blue - ImageMagick doesn't support the Danish letters ÆØÅ, so we use aa to represent å
gennemsigtig = genehmigt - seethrough
baggrund = background :mrgreen: Correct :)

ZhanToO
Posts: 8
Joined: 15 Dec 2016, 03:44

Re: Manipulate data in variable for 30.000 filenames

Post by ZhanToO » 12 Aug 2022, 03:19

The new version doesn't work either :(

No files are outputted at all in this version.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Manipulate data in variable for 30.000 filenames

Post by BoBo » 12 Aug 2022, 05:35

No files are outputted at all in this version.
Well, the only thing I've changed is to use 'expression' style syntax vs your 'legacy style' syntax.
So, simply using MsgBox Instead of Run will show you the path you are about to run and if it needs to be adjusted (no, I haven't installed ImageMagick).
I'd guess that this isn't that tough to master on your own ;)

Edit: I've check the created command lines and so far everything looked fine, except that I've added the "\*.jpg"-wildcard to the FileSetTime-Loop (within the code above). Having another try?

Post Reply

Return to “Ask for Help (v1)”