我想为xcopy创建一个条件语句,只有在xcopy复制某些内容时才会执行某些操作。
基本上我所说的是,如果xcopy复制文件,就要做点什么。
如果不做别的事。
如何使用批次完成此操作?
到目前为止,我有以下内容:
xcopy "Z:\TestFiles.zip" "C:\Test\" /d /y
if xcopy exit code 0 (
)else
更新:
运行以下脚本时:
xcopy /d /y "Z:\TestFiles.zip" "C:\Testing\"
echo %errorlevel%
以下是我得到的结果:
1个文件被复制
C:\ Users \ jmills \ Desktop> echo 0
0
_
0文件被复制
C:\ Users \ jmills \ Desktop> echo 0
0
因为两个错误代码都是0,我不能使用:
IF ERRORLEVEL 1 GOTO FilesCopied
IF ERRORLEVEL 0 GOTO NoFiledCopied
:NoFiledCopied
REM do something
GOTO eof
:FilesCopied
REM do something
GOTO eof
:eof
你可以使用conditional execution operators &&
and ||
:
xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\" && echo success. || echo Failure!
或者,您可以检查ErrorLevel
值:
xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\"
rem // The following consition means 'if ErrorLevel is greater than or equal to 1':
if ErrorLevel 1 (
echo Failure!
) else (
echo Success.
)
这是有效的,因为xcopy
没有返回负的ErrorLevel
值。
或者你可以查询%ErrorLevel%
伪variable的值:
xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\"
if %ErrorLevel% equ 0 (
echo Success.
) else (
echo Failure!
)
请注意,如果上面的代码放在(带括号的)代码块中,则需要启用并应用delayed variable expansion以获取最新的!ErrorLevel!
值。
根据你的update,你想检测xcopy
是否复制了任何文件。根据这个相关的Super User thread,xcopy
永远不会返回1
的退出代码(我认为这是设计缺陷),与documentation相反,即使使用了/D
选项且没有复制文件。
为了避免这种情况,您可以通过# File(s)
捕获返回的摘要消息(for /F
loop),提取数字(#
)并检查它是否大于0
。仍应检查退出代码,因为可能会出现其他异常:
rem // Initialise variable:
set "NUM=0"
rem /* Use a `for /F` loop to capture the output of `xcopy` line by line;
rem the first token is stored in a variable, which is overwritten in
rem each loop iteration, so it finally holds the last token, which is
ewm nothing but the number of copied files; if `xcopy` fails, number `0`
rem is echoed, which is then captured as well: */
for /F "tokens=1" %%E in ('
2^> nul xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\" ^|^| echo 0
') do (
rem // Capture first token of a captured line:
set "NUM=%%E"
)
rem // Compare the finally retrieved count of copied files:
if %NUM% gtr 0 (
echo Success.
) else (
echo Failure!
)
考虑到捕获的摘要行是依赖于语言的,因此要提取的令牌以及回显的失败文本(0
)可能需要相应地进行调整。
您可以使用robocopy
而不是xcopy
:
ROBOCOPY "Z:\\" "C:\Test\\" "TestFiles.zip"
IF ERRORLEVEL 1 GOTO FilesCopied
IF ERRORLEVEL 0 GOTO NoFiledCopied
:NoFiledCopied
REM do something
GOTO eof
:FilesCopied
REM do something
GOTO eof
:eof
有关robocopy
:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy的更多信息