您好我有一个批处理脚本可以将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 :(得分: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 :(得分: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个文件,假设没有移动的文件名与目标中的现有文件匹配。