命令行计数器不递增
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 个文件。
您好,我有一个批处理脚本可以将 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 个文件。