Warum listet der Befehl „forfiles“ Dateien auf, die nicht einen Tag alt sind, obwohl der Befehl etwas anderes besagt?

Warum listet der Befehl „forfiles“ Dateien auf, die nicht einen Tag alt sind, obwohl der Befehl etwas anderes besagt?

Der Befehl, den ich ausführe, istforfiles -p"C:\testdata" -m*.* -d-1 -c"cmd /c echo @PATH\@FILE"

Ich habe angegeben, dass ich nur Dateien auflisten möchte, die einen Tag alt sind. Wenn ich die Anweisung jedoch ausführe, erhalte ich eine Liste mit Dateien, die heute erstellt wurden.

Warum ist das so? Mache ich etwas falsch? Wäre es besser, einen Zeitraum anstelle eines Datums anzugeben, z. B. 24 Stunden?

Die Version von forfiles, die ich habe, lautet wie folgt . Die Batchdatei wird unter Windows XP ausgeführt.FORFILES v 1.1 - [email protected] - 4/98

Antwort1

ForfilesDie von Ihnen verwendete Version ist kein nativer XP-Befehl. Es handelt sich um eine ältere Version des Dienstprogramms, die ursprünglich mit einem der W2K Resource Kits(ich glaube, es gehört sogar zum NT Resource Kit, obwohl ich mir nicht sicher bin) verteilt wurde. Es ist an sich nichts falsch daran, es unter XP zu verwenden, aber wenn Sie sich die Syntax genau ansehen, steht dort (Hervorhebung von mir):

-d[+|-][TTMMJJ|TT] Wählt Dateien mit Datum >= oder <=TTMMJJ(KOORDINIERTE WELTZEIT) oder Dateien mit Datum >= oder <= (aktuelles Datum – TT. Tage)

Notizkoordinierte Weltzeitin der Beschreibung. Das bedeutet, (1.1) forfilesdass andere Zeitstempel verwendet werden, als Sie denken – es sei denn, Ihre Systemzeit ist UTC (kein Offset), keine Sommerzeit.
Mit einem Beispiel wird das wahrscheinlich einfacher. Ich bin UTC+1, Sommerzeit.
(heutiges Datum – 19.09.2012)

  • Datei erstellen und ein Verzeichnis erstellen:

19.09.2012 00:14 5 zzz_utc.txt

Es enthält das heutige Datum und sollte daher nicht von Forfiles ausgewählt werden. Überprüfen wir das:

FORFILES -pc:\temp -mzzz_utc.* -d-1 -c"CMD /C Echo @FILE"
zzz_utc.txt

Aber es wird ausgewählt! Warum? Schauen wir uns die UTC-Zeiten in der Datei an (der folgende Befehl wird von Powershell ausgeführt):

ls .\zzz_utc.txt |select LastAccessTime,LastAccessTimeUTC

LastAccessTime                          LastAccessTimeUtc
--------------                          -----------------
2012-09-19 00:15:11                     2012-09-18 22:15:11

Wie du sehen kannst,ZeitUtc- Das von verwendete (1.1) forfilesist von gestern! Deshalb wird es vom Tool ausgewählt.

Antwort2

„… Ich möchte nur Dateien auflisten, die einen Tag alt sind …“

Meinen Sie „Dateien, die gestern erstellt wurden“? D. h. (heute ist der 18. September) Dateien, deren Änderungsdatum/-zeit ≥ 0000 (Mitternacht am frühen Morgen des) 17. September und ≤ 2359,60 (Mitternacht am Ende des) 17. September ist. Nun, das sind zwei Datums-/Zeitbeschränkungen und forfilesSie können nicht mehr als eine angeben. Fazit: Ich glaube, das forfileswird nicht funktionieren.

... Wenn ich es jedoch /d -1auf meiner Windows 7-Box versuche, erhalte ich Dateien, die gestern oder früher erstellt wurden. Vielleicht ist also die Windows XP-Version forfilesdefekt.

Antwort3

Von demgute Dokumentation(Hervorhebung von mir):

Wählt Dateien aus, deren letztes Änderungsdatum nach oder gleich (+) dem aktuellen Datum plus der angegebenen Anzahl von Tagen oder vor oder gleich (-) dem aktuellen Datum liegt.abzüglich der angegebenen Anzahl Tage.

Bearbeiten:

Vielleicht könnten Sie es mit einem VBScript versuchen:

Set args = WScript.Arguments.Named
Set fso  = CreateObject("Scripting.FileSystemObject")

d = 0
p = "."

If args.Exists("?") Or args.Count = 0 Then
  WScript.Echo "Usage: cscript " & WScript.ScriptName & " [/d:DAYS] [/p:PATH]"
  WScript.Quit(0)
End If

If args.Exists("d") Then d = args("d")
If args.Exists("p") Then p = args("p")

refDate = DateAdd("d", d, Now)
TraverseFolders fso.GetFolder(p)

Sub TraverseFolders(fldr)
  For Each f In fldr.Subfolders
    TraverseFolders(f)
  Next
  For Each f In fldr.Files
    If f.DateLastModified < refDate Then
      WScript.StdOut.WriteLine f.Path
      'f.Delete
    End If
  Next
End Sub

Antwort4

Scheint, als ob FORFILES /D -1 sogar unter Windows 8 und Windows Server 2008 R2 einen Fehler hat (funktioniert nicht – wählt alle Dateien aus – auf einem System mit griechischen Datumsangaben).

Sie könnten das %date% wie in einem der Kommentare oben vorgeschlagen analysieren, aber beachten Sie, dass das Datum unter Windows 8 beispielsweise zuerst 3 Buchstaben mit dem Wochentag und einem Leerzeichen anzeigt, dann das klassische Datumsformat. Außerdem wird dieses Datum im lokalisierten Format angezeigt, während FORFILES /D ein Datum im Format TT/MM/JJJJ erwartet, gemäß forfiles /? (zumindest unter Win8).

KORREKTUR: Es scheint ein Missverständnis zu geben (bei mir und auch bei anderen, nach einer Suche im Internet zu urteilen) darüber, was /D -dd macht, es scheint nicht nach Dateien zu suchen, die dd Tage alt sind, sondern nach Dateien, die älter als dd Tage sind.

Sie müssen also die Syntax /D +dd/MM/yyyy von FORFILES verwenden und dort das gestrige Datum eingeben, um alle Dateien zu finden, deren Datum nach gestern liegt. Um dies zu automatisieren, können Sie %date% verwenden und es mit %date:~7,2%/%date:~4,2%/%date:~-4% oder so ähnlich analysieren (je nach Ihrem Gebietsschema müssen Sie die Datumsteile dort möglicherweise neu anordnen).

verwandte Informationen