@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
SET limit=5
FOR /f "delims=" %%a IN ('dir /b /s /ad "%sourcedir%\*"') DO (
SET /a newnum=2
FOR /f %%c IN ('dir /b/a-d "%%~a" 2^>nul ^|find /c /v ""') DO IF %%c gtr %limit% CALL :process "%%a"
)
)
GOTO :EOF
:process
IF EXIST "%~1(%newnum%)\" SET /a newnum+=1&GOTO process
ECHO MD "%~1(%newnum%)"
FOR /f "skip=%limit%delims=" %%m IN ('dir /b /a-d "%~1"') DO ECHO MOVE "%~1\%%m" "%~1(%newnum%)\"
GOTO :eof
夠簡單。我已經將sourcedir設置爲恆定,並且出於同樣的原因將限制設置爲5。
首先構建原始diretory樹的列表,然後計算每個目錄中的文件。如果該數量大於限制,則處理該目錄。
在處理過程中,首先找到建議的新目錄是否已經存在。如果是這樣,繼續增加數字,直到它不。
然後列出來自原始完整目錄名的文件名(僅),跳過第一個%limit%
,其餘部分將它們移到新的目錄名。
爲了測試目的,所需的命令僅僅是ECHO
。在確認命令正確後,將ECHO MD
更改爲MD
以實際創建目錄。追加2>nul
壓制錯誤信息(例如,當該目錄已經存在)
,並更改ECHO MOVE
到MOVE
實際移動文件。追加>nul
打壓報告消息
編輯(例如,1 file moved
):修訂了「移動文件的一半」
@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
SET limit=5
FOR /f "delims=" %%a IN ('dir /b /s /ad "%sourcedir%\*"') DO (
SET /a newnum=2
FOR /f %%c IN ('dir /b/a-d "%%~a" 2^>nul ^|find /c /v ""') DO IF %%c gtr %limit% SET /a nmove=%%c/2&CALL :process "%%a"
)
)
GOTO :EOF
:process
IF EXIST "%~1(%newnum%)\" SET /a newnum+=1&GOTO process
ECHO MD "%~1(%newnum%)"
FOR /f "skip=%nmove%delims=" %%m IN ('dir /b /a-d "%~1"') DO ECHO MOVE "%~1\%%m" "%~1(%newnum%)\"
GOTO :eof
(簡單地計算計的一半到nmove
然後跳過這個數字,而不是)
這個版本更好解釋。 – brianadams
'IF EXIST'%〜1(%newnum%)\「SET/a newnum + = 1&GOTO process' nice ++。我錯過了樹林。 – Endoro
感謝您的所有幫助 – user1017063