為什麼 forfiles 命令列出了不到一天的文件,儘管命令不是這樣?

為什麼 forfiles 命令列出了不到一天的文件,儘管命令不是這樣?

我正在執行的命令是forfiles -p"C:\testdata" -m*.* -d-1 -c"cmd /c echo @PATH\@FILE"

我已指定只希望列出一天前的文件,但是當我執行該語句時,它會傳回今天建立的文件清單。

這是為什麼?難道我做錯了什麼?指定一個時間段而不是日期(例如 24 小時)會更好嗎?

我的forfiles版本如下。該批次檔正在 Windows XP 上執行。FORFILES v 1.1 - [email protected] - 4/98

答案1

Forfiles您使用的版本不是本機 XP 指令。它是該實用程式的舊版本,最初與其中之一一起分發W2K Resource Kits(我認為它甚至適用於 NT 資源工具包,儘管我不確定)。在 XP 上使用它本身並沒有什麼問題,但是如果你仔細研究它的語法,它會說(強調我的):

-d[+|-][DDMMYY|DD] 選擇日期 >= 或 <=DDMMYY 的文件(世界標準時間) 或日期 >= 或 <= 的文件(目前日期 - DD 天)

筆記世界標準時間在描述中。這意味著(1.1) forfiles使用與您認為不同的時間戳記 - 除非您的系統時間是 UTC(無偏移),沒有夏令時。
透過一個例子這可能會更容易。我現在是UTC+1,夏令時。
(今日日期 - 2012-09-19)

  • 建立檔案並執行目錄:

2012-09-19 00:14 5 zzz_utc.txt

它有今天的日期,所以它不應該被 forfiles 選擇,讓我們檢查一下:

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

但它確實被選中了!為什麼?讓我們看看檔案的 UTC 時間(以下命令是從 powershell 運行的):

ls .\zzz_utc.txt |select LastAccessTime,LastAccessTimeUTC

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

如你看到的,時間UTC- 用的(1.1) forfiles是昨天的!這就是該工具選擇它的原因。

答案2

“...我希望只列出一天前的文件...”

您的意思是「昨天創建的文件」嗎?即(今天是 9 月 18 日),修改日期/時間 ≥ 0000(9 月 17 日凌晨)且 ≤ 2359.60(9 月 17 日結束)的文件forfiles。您指定多個。底線:我相信forfiles不會那樣做。

……但是,當我嘗試/d -1使用 Windows 7 機器時,我收到了昨天或之前建立的檔案。所以也許 Windows XP 版本forfiles已經損壞了。

答案3

來自精美的文檔(強調我的):

選擇上次修改日期晚於或等於 (+) 當前日期加上指定天數或早於或等於 (-) 當前日期的文件減去指定的天數

編輯:

也許你可以嘗試使用 VBScript:

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

答案4

似乎 FORFILES /D -1 即使在 Windows 8 和 Windows Server 2008 R2 上也有一個錯誤(無法使其工作 - 選擇所有檔案 - 在具有希臘日期的系統上)

您可以按照上面的一些評論中的建議解析 %date%,但請注意,例如在 Windows 8 上,日期顯示 3 個字母,首先是日期名稱和空格字符,然後是經典日期格式。此外,該日期將採用在地化格式,而 FORFILES /D 根據 forfiles /? 預計日期為 dd/MM/yyyy 格式。 (至少在 Win8 上)。

更正:對於 /D -dd 的作用似乎存在誤解(我和其他人也從網上搜索判斷),似乎它不搜索 dd 天舊的文件,而是搜索早於 dd 天的文件

因此,您需要使用 FORFILES 的 /D +dd/MM/yyyy 語法並傳入昨天的日期來查找日期大於昨天的所有檔案。要自動化此操作,您可以使用 %date% 並用 %date:~7,2%/%date:~4,2%/%date:~-4% 或類似的東西解析它(可能需要重新排序日期部分取決於您所在的地區)

相關內容