2015-02-23 50 views
0

嗨我有一個批處理腳本將x文件從一個文件夾移動到另一個文件夾。計數移動文件的計數器不會遞增。腳本如下命令行計數器不遞增

SETLOCAL ENABLEEXTENSIONS 
SETLOCAL ENABLEDELAYEDEXPANSION 

echo on 
set DataMax=50 
set Counter=1 
set SrcMax=50 
set DataLoc=Destination Folder 
Set HoldLoc=Source Folder 
set count=0 
FOR /F %%a in ('DIR /B %DataLoc%\*.pst') do set /A count=count+1 
if %count% GEQ %DataMax% (Goto Exit) else (GOTO FMove) 
:FMove 
Echo Gather Top 50 files 

FOR /F "TOKENS=*" %%a IN ('dir /A-D /O-D /B %HoldLoc%\*.pst') DO (
     if %Counter% LEQ %SrcMax% (
     MOVE /y %HoldLoc%\%%a %DataLoc%\ 
     SET /A Counter += 1 
     ) 
    ) 
goto Exit 
:Exit 
exit 

Set/A Counter + = 1似乎不起作用。在此先感謝您的幫助。

+0

除非您有罕見的配置,否則不需要'setlocal enableExtensions',因爲默認情況下啓用了擴展。如果你真的想顯式啓用擴展和延遲擴展,那麼你應該使用一個命令 - 「setlocal enableExtensions enableDelayedExpansion' – dbenham 2015-02-23 15:12:05

回答

4

正如你已經啓用延遲擴展嘗試,如:

FOR /F "TOKENS=*" %%a IN ('dir /A-D /O-D /B %HoldLoc%\*.pst') DO (
     if !Counter! LEQ %SrcMax% (
     MOVE /y %HoldLoc%\%%a %DataLoc%\ 
     SET /A Counter=Counter+1 
     ) 
    ) 
1

npockmaka展示瞭如何讓你的代碼,通過使用延遲擴展在正常情況下工作。但是,如果任何文件名包含!字符(不太可能,但可能發生),它將會失敗。

當超過最大計數時,有可能通過故意除以零來使代碼無延遲擴展地工作。通過重定向到nul隱藏錯誤消息,並且||運算符檢測到錯誤並有條件地執行EXIT命令。

我還簡化了第一個循環,使用FIND快速獲取計數,而不是迭代每個文件。

@echo off 
setlocal 
set /a count=0, SrcMax=DataMax=50 
set "DataLoc=Destination Folder" 
set "HoldLoc=Source Folder" 
for /f %%N in (
    'dir /b "%DataLoc%\*.pst"^|find /c /v ""' 
) do if %%N geq %DataMax% exit /b 
echo Gather Top 50 files 
for /f "eol=: delims=" %%A in (
    'dir /a-d /o-d /b "%HoldLoc%\*.pst"' 
) do (
    set /a "1/(SrcMax-count), count+=1" 2>nul || exit /b 
    move /y "%HoldLoc%\%%B" "%DataLoc%\" 
) 

另一種選擇是經由編號FINDSTR/N的每個文件,並且讓FOR/F解析出的數量和文件名。

@echo off 
setlocal 
set /a SrcMax=DataMax=50 
set "DataLoc=Destination Folder" 
set "HoldLoc=Source Folder" 
for /f %%N in (
    'dir /b "%DataLoc%\*.pst"^|find /c /v ""' 
) do if %%N geq %DataMax% exit /b 
echo Gather Top 50 files 
for /f "tokens=1* delims=:" %%A in (
    'dir /a-d /o-d /b "%HoldLoc%\*.pst"^|findstr /n "^"' 
) do (
    if %%A gtr %SrcMax% exit /b 
    move /y "%HoldLoc%\%%B" "%DataLoc%" 
) 

在你的邏輯中有一件事與我有關。

如果你已經在你的目的地有50個文件,那麼你不用做任何事情就退出。如果您還沒有50個文件,那麼您最多可以將50個文件從源文件移動到目標文件。如果開始時目的地中有49個文件,則假定沒有任何移動的文件名與目標中的現有文件匹配,則最終有可能在目標中包含99個文件。