forfiles
執行/C
選項後的命令行,並將當前迭代的目錄作爲工作目錄。 /S
選項也是如此。
參考@file
返回純文件名(帶引號);參考@relpath
返回相對於給定根的路徑(位於/P
選項後面,該選項默認爲當前目錄)。
所以你可以嘗試這樣的事情(注意cmd /C
前綴需要cmd
像move
,echo
或if
-internal命令;大寫ECHO
只是顯示,將不被執行的move
命令行):
forfiles /S /D -90 /C "cmd /C if @isdir==FALSE ECHO move @relpath 0x22C:\temp\0x22"
這會將所有文件移動到C:\temp
目錄中,但會丟失原始目錄層次結構。 (請注意,if @isdir==FALSE
查詢阻止子目錄被處理。)
因此,我們需要建立我們自己的目標目錄,如:
forfiles /S /D -90 /C "cmd /C if @isdir==FALSE (for %F in (@relpath) do @(2> nul mkdir 0x22C:\temp\%~F\..0x22 & ECHO move @relpath 0x22C:\temp\%~F0x22))"
這裏發生:
- 一般而言,
0x22
代表引號"
;
if @isdir==FALSE
確保只處理文件;
for
循環僅刪除由@relpath
檢索的路徑中的周圍引號,當由%~F
訪問時;如果您在批處理文件中使用代碼,請確保將%
標誌加倍!
mkdir
創建當前迭代項的父目錄; 2> nul
在目錄已經存在的情況下隱藏錯誤消息;
move
前面有ECHO
用於測試目的;刪除它實際移動文件;
如果要覆蓋目標位置中的文件,只需將/Y
選項添加到move
即可。
以下命令行也可能工作爲樣本路徑,但它是要失敗的肯定的情況下,目標路徑包含的空格或其他有毒的人物,因爲報價是不正確的處理:
forfiles /S /C "cmd /C if @isdir==FALSE (2> nul mkdir C:\temp\@relpath\.. & ECHO move @relpath C:\temp\@relpath)"
堆棧溢出搜索[\ [批處理文件\]或\ [cmd \]移動文件比舊](http://stackoverflow.com/search?q=%5Bbatch-file%5D+or+%5Bcmd %5D +移動+文件+舊+ +)返回75次。所以這絕對不是第一次被問到。我建議你閱讀找到的問題和答案。使用Windows命令解釋程序的主要問題是沒有內置的時間差計算支持。最好使用PowerShell。所有「早於」問題的主批處理文件/ cmd主題爲:[用於刪除N天前文件的批處理文件](http://stackoverflow.com/questions/51054/)。 – Mofi