命令行计数器不递增

Command line counter not incrementing

您好,我有一个批处理脚本可以将 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 似乎不起作用。在此先感谢您的帮助。

因为您已经启用了延迟扩展,请尝试这样:

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
       )
    )

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 个文件,则假设移动的文件名中 none 与目标中的现有文件匹配,则目标中最终可能有 99 个文件。