
我正在執行的命令是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% 或類似的東西解析它(可能需要重新排序日期部分取決於您所在的地區)