2014-01-27 27 views
0

我需要按大小對當前目錄中的文件進行排序並將其移至相應的文件夾。難度不是觸及.bat文件。我不能這樣做。 例如,此行將移動.bat文件和腳本將停止。按執行文件大小排序文件

forfiles /p %CD% /s /m *.* /c "cmd /c if @fsize gtr 100 move @file %~dp0/200" 
+0

我的困難是理解你的問題。相應的文件夾是什麼意思? – dbenham

+0

另外,你想保留所有'.bat'文件的當前位置,還是隻保存當前正在執行的文件? – dbenham

+0

@dbenham例如命名爲'100','200','300'的文件夾(以需要排序的文件的大小命名) – Eugene

回答

2

剛上放置一個鎖當前批處理文件

< "%~f0" (
    forfiles .... 
) 

由於批處理文件重定向輸入,它已被鎖定,無法移動或刪除

編輯 - 作爲dbenham評論,必須考慮錯誤處理,所以讓我們排除當前批處理文件的處理

forfiles /p "%cd%" /m * /c "cmd /c if @fsize gtr 100 if /i not @path==\"%~f0\" move @path \"%cd%\200\" " 

如果文件大小> 100,如果正在處理的文件的完整路徑不等於當前批處理文件的完整路徑,則移動文件

不確定目標是否應該是子目錄的當前文件夾的子目錄批文件所在文件夾的位置(如果不相同),則使用第一個選項。

EDIT 2 - 如果由於某種原因,大小狀況的變化和文件夾下檢查下跌,它們可以被排除添加aditional的,如果條件

forfiles /p "%cd%" /m * /c "cmd /c if @isdir==FALSE if @fsize gtr 100 if /i not @path==\"%~f0\" move @path \"%cd%\200\" " 
+0

+1,這是一個聰明的方法。但是,或者生成了不需要的錯誤消息,或者如果將錯誤重定向到nul,則所有錯誤都將丟失。理想情況下,它應該只嘗試移動文件,如果它不是自己的,以便保存錯誤消息。 – dbenham

+0

此外,應添加額外的代碼以防止移動文件夾的嘗試。 – dbenham

+0

@dbenham,對我來說,對於我來說,fsize在文件夾中返回0,所以,大小文本排除它們,但無論如何,測試目錄包括 –

2

我儘量避免FORFILES,因爲它是相當緩慢。我通常只在需要日期計算時才使用它。

簡單的FOR/R循環既快速又簡單。它將自動僅迭代文件。它默認爲當前目錄,就像您當前使用的那樣。

%%~fF生成當前文件迭代的完整路徑,%%~zF文件大小,%~f0生成當前正在執行的批處理腳本的完整路徑。

以下內容應複製問題中代碼的邏輯,但它也會阻止當前正在執行的批處理腳本的移動。我也將輸出重定向到nul以隱藏1 file(s) moved.消息。這個解決方案應該比FORFILES快得多。

for /r %%F in (*) do if "%%~fF" neq "%~f0" do (
    if %%~zF gtr 100 move "%%F" "%~dp0\200" >nul 
) 

您可能會或可能不希望將/Y選項添加到MOVE命令。

如果您必須區分大於2 GB的大文件,則不能直接比較文件大小,因爲批處理數值條件限制爲2147483647.有關更多信息,請參閱Windows batch file IF failure - How can 30000000000000 equal 40000000000?,其中包括有關如何處理大文件的策略大小。

+0

如果檢查值的IF限制隻影響測試的正確部分。只要它保持在2147483648以下,它將獨立於文件的大小 –

+0

@MCND - 不,雙方的影響是一樣的。但是,如果需要區分大於2GB的文件,則只會成爲問題。進行數字中頻比較時,任何大於2GB的數字都將被視爲2GB。也許這就是你的評論意思,但不清楚。 – dbenham

+0

對不起,表達不佳。我只是在考慮執行錯誤。 –