2014-01-11 95 views
0

我想創建一個windows批處理文件,它將掃描具有多個子文件夾的文件夾。每個子文件夾可以包含許多文件。我需要腳本來檢查一個子文件夾是否包含超過一定數量的文件,以及它是否將一半的文件移動到一個具有相同名稱但末尾帶有數字的新文件夾中。批處理文件 - 遞歸檢查文件夾和移動文件

實施例:

Main folder 
-Subfolderone 
-Subfoldertwo 
-Subfolderthree 

如果Subfoldertwo包含超過一定數量的文件,可以說,1000,然後內Subfoldertwo文件的一半將被移動到Subfoldertwo(2),依此類推對於每個子文件夾。

Main folder 
-Subfolderone 
-Subfoldertwo 
-Subfoldertwo(2) 
-Subfolderthree 

任何幫助將不勝感激。謝謝。

回答

4
@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 MOVEMOVE實際移動文件。追加>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然後跳過這個數字,而不是)

+0

這個版本更好解釋。 – brianadams

+0

'IF EXIST'%〜1(%newnum%)\「SET/a newnum + = 1&GOTO process' nice ++。我錯過了樹林。 – Endoro

+0

感謝您的所有幫助 – user1017063

3

你可能測試:

@ECHO OFF &SETLOCAL 
set "StartFolder=X:\Main folder" 
set /a MaxFiles=1000 
cd /d "%StartFolder%" 
:NewFolderCreated 
set "NewFolderFlag=" 
for /f "delims=" %%a in ('dir /b /ad /on') do call:process "%StartFolder%\%%~a" 
if defined NewFolderFlag (goto:NewFolderCreated) else goto:eof 

:process 
SETLOCAL 
cd "%~1" 
for /f %%b in ('dir /b /a-d 2^>nul^|find /c /v ""') do set /a FileCount=%%b 
if %FileCount% leq %MaxFiles% exit /b 
set /a MoveCount=FileCount-MaxFiles 
set "CurrentFolder=%~n1" 
set "NextPath=%StartFolder%\%CurrentFolder%(2)%~X1" 
echo("%CurrentFolder%"|findstr /re ".*([0-9][0-9]*)\"^">nul||goto:moving 
set "BasePath=%CurrentFolder:~0,-1%" 
:loop 
if not "%BasePath:~-1%"=="(" set "FolderNo=%BasePath:~-1%%FolderNo%"&set "BasePath=%BasePath:~0,-1%"&goto:loop 
set /a FolderNo+=1 
set "NextPath=%StartFolder%\%BasePath%%FolderNo%)%~X1" 
:moving 
echo(Moving %MoveCount% files from "%~1" to "%NextPath%". 
md "%NextPath%" 2>nul &&set "NewFolderFlag=true" 
for /f "skip=%MaxFiles%delims=" %%b in ('dir /b /a-d /o-n') do move "%~1\%%~b" "%NextPath%" >nul 
endlocal &set "NewFolderFlag=%NewFolderFlag%" 
exit /b 
+0

批次很難看。至少爲新手提供一些意見。 – brianadams

+0

@brianadams是你的新手?想學習醜陋的批次? – Endoro

+0

user1017063顯然是一個新手。你給他這段醜陋的代碼,他只會在不知道發生了什麼的情況下使用它。 – brianadams

相關問題