如何编写仅在xcopy复制某些内容时执行某些操作的条件语句(退出代码0)

问题描述 投票:0回答:2

我想为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
batch-file if-statement xcopy errorlevel
2个回答
1
投票

你可以使用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 threadxcopy永远不会返回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)可能需要相应地进行调整。


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

有关robocopyhttps://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.