批处理脚本中对同一内容的多个 for 循环



我在Windows sendto目录中设置了一个批处理(copy.bat)文件,该文件用于通过右键单击目录并选择sendto"copy.bat"来复制一堆文件。

@echo off
setlocal enabledelayedexpansion
set cnt=0
set cur=0
:files
for /R "%~1" %%F in (*.7z, *.avi) do (set /a cnt+=1)
shift
if "%~1" NEQ "" goto :files
echo !cnt! files found for copying.
echo Processing ...

set "DEST_DIR=E:"
:while
for /R "%~1" %%F IN (*.7z, *.avi) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!%%~dpF:%%~1%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
set /a cur+=1
echo !cur!/!cnt! done...
)
shift
if "%~1" NEQ "" goto :while
pause

如果我单独运行第一个 for 循环,它会计算文件。 如果我自己运行第二个循环,它会复制另一个循环应该计算的那些文件。 但是,一个批处理文件中的两个循环会有些冲突。文件计数工作正常,但复制过程提供错误:"路径太长"。在"的"和"是"之间有一个额外的空格。最终pause将正确等待按钮按下。我认为它必须对%%F变量执行某些操作,但在其中一个循环中重命名它无济于事。

请更改.bat的名称 -copycmd的关键字。

您的问题是第一个例程shift排除了所有参数,因此您的第二个例程没有要处理的参数。

最简单的方法可能是:

set "DEST_DIR=E:"
call :while %*
pause
goto :eof
:while
for /R "%~1" %%F IN (*.7z, *.avi) do (
...
if "%~1" NEQ "" goto while
goto :eof

它将第二个例程作为内部子例程执行(call中的:是必需的),为该例程提供参数列表的新副本(%*)

您还可以考虑将if "~1"...移动到例程的开头(紧接在:while之后),将其更改为if "%~1" EQU "" goto :eof并将最终语句更改为goto while

标签:eof被定义为文件结尾cmd,不应声明。

最新更新