Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 命令行计数器不递增_Batch File_Scripting - Fatal编程技术网

Batch file 命令行计数器不递增

Batch file 命令行计数器不递增,batch-file,scripting,Batch File,Scripting,嗨,我有一个批处理脚本,可以将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

嗨,我有一个批处理脚本,可以将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计数器+=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
       )
    )

由于已启用延迟扩展,请尝试以下操作:

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

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个文件,前提是移动的文件名与目标中的现有文件都不匹配。

除非您有罕见的配置,否则不需要设置本地启用扩展名,因为默认情况下会启用扩展名。如果确实要显式启用扩展和延迟扩展,则应使用一个命令-
setlocal enableExtensions enableDelayedExpansion
,除非具有罕见的配置,否则不需要使用
setlocal enableExtensions
,因为默认情况下已启用扩展。如果确实希望显式启用扩展和延迟扩展,则应使用一个命令-
setlocal enableExtensions enableDelayedExpansion