
As a side note, I agree, that this is one of the cases where AutoHotkey is maybe the least suitable choice for the solution (this is typically a batch file or VBScript task), but hey, for me AutoHotkey was the fastest solution

Moderators: Hacker, petermad, Stefan2, white
If you only want to set to the newest file, my script should be sufficient: http://www.ghisler.ch/wiki/index.php/AutoHotkey:_Set_folder_timestamp_to_newest_fileI just discovered this topic, and I'm very interested by a tool to set folder timestamp (like archive) to newest file
Code: Select all
;*** SetFolderDate.au3 (van Dusen, 15.04.2006)
#include <GUIConstants.au3>
AutoItSetOption("WinTitleMatchMode", 4)
Global $strYMDhmsMin, $strYMDhmsMax
Global $strYMDhmsMinFilename, $strYMDhmsMaxFilename
$frmGUI = GUICreate("Datum von Verzeichnissen ändern", 500, 340)
$grpDisplay = GUICtrlCreateGroup("Datum und Uhrzeit ändern", 10, 10, 480, 125)
$radioSetNewestDate = GUICtrlCreateRadio("das der neuesten Datei", 20, 30, 130, 20)
$radioSetOldestDate = GUICtrlCreateRadio("das der ältesten Datei", 20, 55, 130, 20)
GUICtrlSetState($radioSetOldestDate, $GUI_CHECKED)
$lblFileGetTimeRecurse = GUICtrlCreateLabel("}", 160, 29, 20, 60)
GUICtrlSetFont($lblFileGetTimeRecurse, 28)
$chkFileGetTimeRecurse = GUICtrlCreateCheckbox("Datumsangabe rekursiv ermitteln", 180, 43, 180, 20)
GUICtrlSetState($chkFileGetTimeRecurse, $GUI_CHECKED)
$chkSetFilespecDate = GUICtrlCreateCheckbox("das einer bestimmten Datei:", 20, 80, 150, 20)
$txtSetFilespecDate = GUICtrlCreateInput("", 180, 80, 200, 20)
$chkSetFilespecDateRegEx = GUICtrlCreateCheckbox("RegEx", 390, 80, 50, 20)
$radioSetUserdefDate = GUICtrlCreateRadio("ein bestimmtes:", 20, 105, 150, 20)
$txtSetUserdefDateDMY = GUICtrlCreateInput(@MDAY & "." & @MON & "." & @YEAR, 180, 105, 70, 20)
$txtSetUserdefDatehms = GUICtrlCreateInput(@HOUR & ":" & @MIN & ":" & @SEC, 255, 105, 60, 20)
$btnSetCurrentDate = GUICtrlCreateButton("Aktuelles", 320, 105, 60, 20)
GUICtrlCreateGroup ("", -99, -99, 1, 1)
$lstPreview = GUICtrlCreateListView("Verzeichnis |Datum bisher|Datum neu|Dateiname ", 10, 145, 480, 150)
;~ $lstPreview = GUICtrlCreateListView("Verzeichnis |Datum bisher|Datum neu|Dateiname ", 10, 145, 480, 150, $LVS_SHOWSELALWAYS+$LVS_SINGLESEL+$LVS_SORTASCENDING)
$btnCancel = GUICtrlCreateButton("Abbruch", 410, 305, 80, 25)
$btnOK = GUICtrlCreateButton("OK", 320, 305, 80, 25)
$btnPreview = GUICtrlCreateButton("Vorschau", 230, 305, 80, 25, $BS_DEFPUSHBUTTON)
;~ $lblStatus = GUICtrlCreateLabel("", 3, 337, 494, 20, $SS_SUNKEN)
$lblStatus = GUICtrlCreateLabel("", 10, 310, 200, 25)
GUICtrlSetColor($lblStatus, 0xFF0000)
$refresh = 0
$ct_dirs = 0
If WinExists("classname=TTOTAL_CMD") Then
;*** cm_CopyFullNamesToClip=2018;Copy names with full path
DllCall("user32.dll", "int", "PostMessage", "hwnd", WinGetHandle("classname=TTOTAL_CMD"), "int", 1075, "int", 2018)
Sleep(200)
;*** Meldung "Keine Dateien gewählt!"? Script ohne Ergebnis verlassen!
If WinExists("classname=#32770", "Keine Dateien gewählt!") Then Exit
;*** Einträge der Dateiliste aus Clipboard in Feld $tcpnl einlesen
$tcpnl = StringSplit(ClipGet(), @CRLF, 1)
;*** [0]=Index des ListViewItems; [1]=Verzeichnisname (kompletter Pfad); [2]=Verzeichnisname (nur letzte Pfadkomponente);
;*** [3]=Bisheriges Datum; [4]=Neuestes Dateidatum; [5]=Ältestes Dateidatum; [6]=Name der Datei mit neuestem Datum; [7]=Name der Datei mit ältestem Datum
;*** [8] = Neues Datum
Dim $lstPreviewItem[$tcpnl[0]+1][9]
GUISetState(@SW_SHOW, $frmGUI)
For $i = 1 To $tcpnl[0]
If StringRight($tcpnl[$i], 1) = "\" Then
$ct_dirs = $ct_dirs + 1
$lstPreviewItem[$i][1] = StringTrimRight($tcpnl[$i], 1)
$lstPreviewItem[$i][2] = StringTrimLeft($lstPreviewItem[$i][1], StringInStr($lstPreviewItem[$i][1], "\", 0, -1))
$lstPreviewItem[$i][3] = FileGetTime($lstPreviewItem[$i][1], 0, 1)
$strYMDhmsMin = "99999999999999"
$strYMDhmsMax = "00000000000000"
_BtnDisable()
_DirGetMinMaxFileTime($lstPreviewItem[$i][1])
_BtnEnable()
$lstPreviewItem[$i][4] = $strYMDhmsMax
$lstPreviewItem[$i][5] = $strYMDhmsMin
$lstPreviewItem[$i][6] = $strYMDhmsMaxFilename
$lstPreviewItem[$i][7] = $strYMDhmsMinFilename
$lstPreviewItem[$i][8] = $strYMDhmsMin
$strPreviewItem = $lstPreviewItem[$i][2]
$strPreviewItem = $strPreviewItem & "|" & _FmtDtTm($lstPreviewItem[$i][3])
$strPreviewItem = $strPreviewItem & "|" & _FmtDtTm($lstPreviewItem[$i][5])
$strPreviewItem = $strPreviewItem & "|" & $lstPreviewItem[$i][7]
$lstPreviewItem[$i][0] = GUICtrlCreateListViewItem($strPreviewItem, $lstPreview)
Else
$lstPreviewItem[$i][1] = ""
$lstPreviewItem[$i][2] = ""
$lstPreviewItem[$i][3] = ""
$lstPreviewItem[$i][4] = ""
$lstPreviewItem[$i][5] = ""
$lstPreviewItem[$i][6] = ""
$lstPreviewItem[$i][7] = ""
$lstPreviewItem[$i][8] = ""
$lstPreviewItem[$i][0] = 0
EndIf
Next
If $ct_dirs = 0 Then
MsgBox(0, "SetFolderDate", "Keine Verzeichnisse gewählt!")
GUIDelete($frmGUI)
Exit
EndIf
GUICtrlSetData($grpDisplay, "Datum und Uhrzeit von " & $ct_dirs & " Verzeichnis(sen) ändern in")
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE Or $msg = $btnCancel
GUIDelete($frmGUI)
Exit
Case $msg = $btnSetCurrentDate
GUICtrlSetState($radioSetNewestDate, $GUI_UNCHECKED)
GUICtrlSetState($radioSetOldestDate, $GUI_UNCHECKED)
GUICtrlSetState($chkFileGetTimeRecurse, $GUI_UNCHECKED+$GUI_DISABLE)
GUICtrlSetState($chkSetFilespecDate, $GUI_UNCHECKED+$GUI_DISABLE)
GUICtrlSetState($txtSetFilespecDate, $GUI_DISABLE)
GUICtrlSetState($chkSetFilespecDateRegEx, $GUI_DISABLE)
GUICtrlSetState($radioSetUserdefDate, $GUI_CHECKED)
GUICtrlSetData($txtSetUserdefDateDMY, @MDAY & "." & @MON & "." & @YEAR)
GUICtrlSetData($txtSetUserdefDatehms, @HOUR & ":" & @MIN & ":" & @SEC)
$refresh = 2
Case $msg = $radioSetUserdefDate
GUICtrlSetState($chkFileGetTimeRecurse, $GUI_UNCHECKED+$GUI_DISABLE)
GUICtrlSetState($chkSetFilespecDate, $GUI_UNCHECKED+$GUI_DISABLE)
GUICtrlSetState($txtSetFilespecDate, $GUI_DISABLE)
GUICtrlSetState($chkSetFilespecDateRegEx, $GUI_DISABLE)
$refresh = 2
Case $msg = $radioSetNewestDate Or $msg = $radioSetOldestDate
GUICtrlSetState($chkFileGetTimeRecurse, $GUI_ENABLE)
GUICtrlSetState($chkSetFilespecDate, $GUI_ENABLE)
GUICtrlSetState($txtSetFilespecDate, $GUI_ENABLE)
GUICtrlSetState($chkSetFilespecDateRegEx, $GUI_ENABLE)
$refresh = 3
Case $msg = $chkSetFilespecDate Or $msg = $chkFileGetTimeRecurse Or $msg = $chkSetFilespecDateRegEx
$refresh = 3
Case $msg = $btnPreview Or $msg = $btnOK
For $i = 1 To $tcpnl[0]
GUICtrlSetData($lstPreviewItem[$i][0], $lstPreviewItem[$i][2] & "|" & _FmtDtTm($lstPreviewItem[$i][3]) & "|")
Next
$refresh = 0
If GUICtrlRead($radioSetNewestDate) = $GUI_CHECKED Or GUICtrlRead($radioSetOldestDate) = $GUI_CHECKED Then $refresh = 3
If GUICtrlRead($radioSetUserdefDate) = $GUI_CHECKED Then
$refresh = 2
If Not StringRegExp(GUICtrlRead($txtSetUserdefDateDMY) & " " & GUICtrlRead($txtSetUserdefDatehms), "[0-3]\d\.[0-1]\d\.\d\d\d\d [0-2]\d:[0-5]\d:[0-5]\d") Then
$refresh = 0
MsgBox(0, "Datum ungültig", "Das eingegebene Datum / Uhrzeit ist ungültig")
EndIf
EndIf
EndSelect
If $refresh > 0 Then
For $i = 1 To $tcpnl[0]
If $lstPreviewItem[$i][1] <> "" Then
$strPreviewItem = $lstPreviewItem[$i][2] & "|" & _FmtDtTm($lstPreviewItem[$i][3]) & "|"
Select
Case $refresh = 1
$lstPreviewItem[$i][8] = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC
$strPreviewItem = $strPreviewItem & _FmtDtTm($lstPreviewItem[$i][8]) & "|"
Case $refresh = 2
$lstPreviewItem[$i][8] = StringRegExpReplace(GUICtrlRead($txtSetUserdefDateDMY), "(..)\.(..)\.(....)", "\3\2\1")
$lstPreviewItem[$i][8] = $lstPreviewItem[$i][8] & StringRegExpReplace(GUICtrlRead($txtSetUserdefDatehms), "(..):(..):(..)", "\1\2\3")
$strPreviewItem = $strPreviewItem & _FmtDtTm($lstPreviewItem[$i][8]) & "|"
Case $refresh = 3
$strYMDhmsMax = "00000000000000"
$strYMDhmsMin = "99999999999999"
$strYMDhmsMaxFilename = ""
$strYMDhmsMinFilename = ""
_BtnDisable()
_DirGetMinMaxFileTime($lstPreviewItem[$i][1])
_BtnEnable()
$lstPreviewItem[$i][4] = $strYMDhmsMax
$lstPreviewItem[$i][5] = $strYMDhmsMin
$lstPreviewItem[$i][6] = $strYMDhmsMaxFilename
$lstPreviewItem[$i][7] = $strYMDhmsMinFilename
If GUICtrlRead($radioSetNewestDate) = $GUI_CHECKED Then
If $strYMDhmsMax = "00000000000000" Then
$strPreviewItem = $strPreviewItem & "---|---"
Else
$strPreviewItem = $strPreviewItem & _FmtDtTm($lstPreviewItem[$i][4]) & "|" & $lstPreviewItem[$i][6]
EndIf
$lstPreviewItem[$i][8] = $strYMDhmsMax
Else
If $strYMDhmsMin = "99999999999999" Then
$strPreviewItem = $strPreviewItem & "---|---"
Else
$strPreviewItem = $strPreviewItem & _FmtDtTm($lstPreviewItem[$i][5]) & "|" & $lstPreviewItem[$i][7]
EndIf
$lstPreviewItem[$i][8] = $strYMDhmsMin
EndIf
EndSelect
GUICtrlSetData($lstPreviewItem[$i][0], $strPreviewItem)
EndIf
Next
$refresh = 0
If $msg = $btnOK Then
For $i = 1 To $tcpnl[0]
If $lstPreviewItem[$i][1] <> "" Then
If $lstPreviewItem[$i][8] = "00000000000000" Or $lstPreviewItem[$i][8] = "99999999999999" Then
GUICtrlSetData($lstPreviewItem[$i][0], $lstPreviewItem[$i][2] & "|Unverändert|" & _FmtDtTm($lstPreviewItem[$i][3]))
Else
If FileSetTime($lstPreviewItem[$i][1], $lstPreviewItem[$i][8], 0, 0) Then
GUICtrlSetData($lstPreviewItem[$i][0], $lstPreviewItem[$i][2] & "|OK|" & _FmtDtTm($lstPreviewItem[$i][8]))
Else
GUICtrlSetData($lstPreviewItem[$i][0], $lstPreviewItem[$i][2] & "|Fehler!|" & _FmtDtTm($lstPreviewItem[$i][8]))
EndIf
EndIf
EndIf
Next
GUICtrlSetState($btnOK, $GUI_DISABLE)
GUICtrlSetState($btnPreview, $GUI_DISABLE)
GUICtrlSetData($btnCancel, "Schließen")
;~ GUIDelete($frmGUI)
;~ Exit
EndIf
EndIf
WEnd
EndIf
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Func _DirGetMinMaxFileTime($dirname)
Local $filename
FileChangeDir($dirname)
Local $shndSearch = FileFindFirstFile("*.*")
If @error Then Return
While 1
$filename = FileFindNextFile($shndSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($filename), "D") And GUICtrlRead($chkFileGetTimeRecurse) = $GUI_CHECKED Then
_DirGetMinMaxFileTime($filename)
FileChangeDir("..")
EndIf
If Not StringInStr(FileGetAttrib($filename), "D") Then
$strYMDhmsCur = FileGetTime($filename, 0, 1)
If GUICtrlRead($chkSetFilespecDate) = $GUI_UNCHECKED _
Or (GUICtrlRead($chkSetFilespecDate) = $GUI_CHECKED And GUICtrlRead($chkSetFilespecDateRegEx) = $GUI_UNCHECKED And $filename = GUICtrlRead($txtSetFilespecDate)) _
Or (GUICtrlRead($chkSetFilespecDate) = $GUI_CHECKED And GUICtrlRead($chkSetFilespecDateRegEx) = $GUI_CHECKED And StringRegExp($filename, GUICtrlRead($txtSetFilespecDate)) = 1) Then
If $strYMDhmsCur > $strYMDhmsMax Then
$strYMDhmsMax = $strYMDhmsCur
$strYMDhmsMaxFilename = $filename
EndIf
If $strYMDhmsCur < $strYMDhmsMin Then
$strYMDhmsMin = $strYMDhmsCur
$strYMDhmsMinFilename = $filename
EndIf
EndIf
EndIf
WEnd
FileClose($shndSearch)
Return
EndFunc
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Func _FmtDtTm($datetime)
Return StringRegExpReplace($datetime, "(....)(..)(..)(..)(..)(..)", "\3.\2.\1 \4:\5:\6")
EndFunc
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Func _BtnDisable()
GUICtrlSetState($btnCancel, $GUI_DISABLE)
GUICtrlSetState($btnOK, $GUI_DISABLE)
GUICtrlSetState($btnPreview, $GUI_DISABLE)
GUICtrlSetData($lblStatus, "Bitte warten...")
EndFunc
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Func _BtnEnable()
GUICtrlSetState($btnCancel, $GUI_ENABLE)
GUICtrlSetState($btnOK, $GUI_ENABLE)
GUICtrlSetState($btnPreview, $GUI_ENABLE)
GUICtrlSetData($lblStatus, "")
EndFunc
Our guy!182KiB
Code: Select all
loop %sFolder%\*,,1
{
bThereIsFile := True
if (dTimestamp < A_LoopFileTimeModified and A_LoopFileName<>"descript.ion")