我在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
的名称 -copy
是cmd
的关键字。
您的问题是第一个例程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
,不应声明。