[V1] Funktion Ordnerdatum anpassen

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

[V1] Funktion Ordnerdatum anpassen

Post by fredchf » 28 Mar 2023, 15:30

Hallo!
Ein gewisser :D just me war so freundlich ein nützliches Script aus dem alten Forum zu renovieren und es hier viewtopic.php?f=10&t=115354 einzustellen. Nach dem Kopieren sind leider die Änderungsdaten der Ordner auf das Kopierdatum kopiert.
Da ich mich gerne an dem Ordneränderungsdatum orientiere, habe ich folgendes Script erstellt. Das Script durchsucht alle Ordner rekursiv nach Elementen und setzt das Änderungsdatum der Ordner auf das neueste Änderungsdatum der enthaltenen Dateien. Das zurückgegebene Objekt ist nur für die Statistik. ;)

Das Script und benötigte Funktionen:

Code: Select all

func_ordnerdatum(ordner = "")
{
	O := {}																		; ein Objekt sammelt die Anzahl von Dateien im Ordner
	loop, Files,  % ordner "\*.*",  DFR
	{
		if !(InStr(A_LoopFileAttrib, "D"))										; kein Ordner
		{
			O["Ordnerz", A_LoopFileDir] := O["Ordnerz", A_LoopFileDir] ? O["Ordnerz", A_LoopFileDir] + 1 : 1		; erhöht den Zähler im Objekt wenn Datei
			if (O["Ordnerz", A_LoopFileDir] = 1 or (A_LoopFileTimeModified > FileGetTime(A_LoopFileDir, "M")))	; wenn erste Datei or Dateidatum neuer als Ordnerdatum
			{
				FileSetTime(A_LoopFileTimeModified, A_LoopFileDir, "M",  2)		; übernimmt erste Datei-Datum für Ordner
				O["Ordnert", A_LoopFileDir] := A_LoopFileTimeModified
			}
		}
	}
	return, O																	; Objekt zurück
}
; --------------------Befehle als Funktion------------------------------------
FileSelectFolder(StartingFolder="", Options="", Prompt="")
{
	FileSelectFolder, out, %StartingFolder%, %Options%, %Prompt%
	Return out
}
FileGetAttrib(Filename="")
{
	FileGetAttrib, out, %Filename%
	Return out
}
FileGetTime(Filename="", WhichTime="")
{
	FileGetTime, out, %Filename%, %WhichTime%
	Return out
}
FileSetTime(YYYYMMDDHH24MISS="", FilePattern="", WhichTime="", OperateOnFolders="", Recurse="")
{
    try
        FileSetTime, %YYYYMMDDHH24MISS%, %FilePattern%, %WhichTime%, %OperateOnFolders%, %Recurse%
    catch e
		Return e.Message
	Return 0
}

Beispielscript:

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
; --------------------------------------------------------
ordner := FileSelectFolder(A_MyDocuments, "", "Bitte Ordner wählen")
if !ordner																			; nichts übergeben?
	ExitApp
O := func_ordnerdatum(Ordner)
MsgBox,  % O.Ordnerz.Count() " Ordner angepasst"
Show_Obj(O)		; liefert alle Elemente des Objektes 
ExitApp
; --------------------------------------------------------
func_ordnerdatum(ordner = "")
{
	O := {}																		; ein Objekt sammelt die Anzahl von Dateien im Ordner
	loop, Files,  % ordner "\*.*",  DFR
	{
		if !(InStr(A_LoopFileAttrib, "D"))										; kein Ordner
		{
			O["Ordnerz", A_LoopFileDir] := O["Ordnerz", A_LoopFileDir] ? O["Ordnerz", A_LoopFileDir] + 1 : 1		; erhöht den Zähler im Objekt wenn Datei
			if (O["Ordnerz", A_LoopFileDir] = 1 or (A_LoopFileTimeModified > FileGetTime(A_LoopFileDir, "M")))	; wenn erste Datei or Dateidatum neuer als Ordnerdatum
			{
				FileSetTime(A_LoopFileTimeModified, A_LoopFileDir, "M",  2)		; übernimmt erste Datei-Datum für Ordner
				O["Ordnert", A_LoopFileDir] := A_LoopFileTimeModified
			}
		}
	}
	return, O																	; Objekt zurück
}
; --------------------Befehle als Funktion------------------------------------
FileSelectFolder(StartingFolder="", Options="", Prompt="")
{
	FileSelectFolder, out, %StartingFolder%, %Options%, %Prompt%
	Return out
}
FileGetAttrib(Filename="")
{
	FileGetAttrib, out, %Filename%
	Return out
}
FileGetTime(Filename="", WhichTime="")
{
	FileGetTime, out, %Filename%, %WhichTime%
	Return out
}
FileSetTime(YYYYMMDDHH24MISS="", FilePattern="", WhichTime="", OperateOnFolders="", Recurse="")
{
    try
        FileSetTime, %YYYYMMDDHH24MISS%, %FilePattern%, %WhichTime%, %OperateOnFolders%, %Recurse%
    catch e
		Return e.Message
	Return 0
}
; --------------------------------------------------------
Show_Obj(a,  warte = 1)
	{
		Static edit := ""
		r := List_Obj(a)
		Gui, install:new, +HwndEigenesGuiHwnd
		gui, add, Edit, % "w" A_ScreenWidth / 10 * 8 " R40 -Wrap vedit",
		gui, Show, , Show_Obj - %EigenesGuiHwnd%
		GuiControl, , edit, %r%
		if warte
			loop
			{
				Sleep,  500
				if % !WinExist("ahk_id " EigenesGuiHwnd)
					Break
			}
		return   EigenesGuiHwnd
	}
;---Funktion List_Obj by Bentschi; Modifiziert by MEC---------------------
List_Obj(a)
	{
		if (isobject(a))
		{
			for k, v in a
			{
				r .= ((r) ? "`r`n" : "") "[" k "]"
				if (isobject(v)) {
					r .=  regexreplace("`t" func(A_ThisFunc).(v), "`r`n", "`r`n...`t")
				} else
					r .= "`t= >" v "<"
			}
			return r
		}
		return "Fehler: Es wurde kein Object übergeben"
}	
Last edited by fredchf on 04 Apr 2023, 00:58, edited 1 time in total.

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: [V1] Funktion Ordnerdatum anpassen

Post by halweg » 29 Mar 2023, 04:41

Ok, wenn es um die Zeitstempel geht, sollte ich vielleicht auf mein entsprechendes Skript hinweisen:
viewtopic.php?f=10&t=87105
Das berücksichtigt neben dem Änderungsdatum auch das Erstelldatum, indem es das Erstelldatum jedes Verzeichnisses auf das früheste Erstelldatum der enthaltenen Dateien setzt. Weiterhin habe ich eine Erkennung für meine NAS-Laufwerke eingebaut, da diese bei mir mit Ext3 laufen und deshalb einen anderen Zeitstempel brauchen.
Mein Skript ist nicht so ambitioniert gecodet (hier lerne ich gerade dazu), dafür aber aber wegen der ausführlichen Kommentierung wahrscheinlich besser lesbar. Und ja, da gibt es eine Fortschrittsanzeige.

fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

Re: [V1] Funktion Ordnerdatum anpassen

Post by fredchf » 29 Mar 2023, 16:25

Hallo halweg!
Danke für den Hinweis. Meine Funktion macht nicht das Gleiche wie dein Script und war auch nicht als Konkurrenz für deines gedacht. Wer es nutzen will, kann es tun. Wenn du deines besser findest, verstehe ich das ;)
Auf eine Fortschrittsanzeige kann ich verzichten, weil das Script bei mir für 5000 Ordner bearbeiten und 25.000 Dateien scannen nur 5 Sek. läuft.
VG

Post Reply

Return to “Skripte und Funktionen”