gpt4 book ai didi

batch-file - xcopy errorlevels 返回零而不是 1 找不到要复制的文件

转载 作者:行者123 更新时间:2023-12-05 05:16:59 25 4
gpt4 key购买 nike

在此批处理脚本中,我正在测试预期 1 的错误级别返回,但它的回显是 0

如果没有文件复制,文件夹为空,为什么会返回0表示成功?

我将按照以下 xcopy 错误级别进行操作:

XCOPY should return the following exit codes:

  • 0 Files were copied without error.
  • 1 No files were found to copy.
  • 2 The user pressed CTRL+C to terminate xcopy.
  • 4 Initialization error occurred. There is not enough memory or disk space, or you entered an invalid drive name or invalid syntax on the command line.
  • 5 Disk write error occurred.

这是我的批处理脚本:

@ECHO ON
SET ERRORS=0

REM Backup file first and report any errors if unsuccessful
xcopy /Y "C:\channels\filetransfer_process\*" "C:\channels\backup\"
echo %ERRORLEVEL%
REM Error Checking
REM Note The environmental variable ERRORLEVEL contains the return code of
the last executed program or script.
if errorlevel 2 (
SET BODY="not enough memory or disk space"
GOTO :mailerror

)
if errorlevel 1 (
SET BODY="No files were found to copy"
GOTO :mailerror
)

if errorlevel 5 (
SET BODY="Disk write error occurred"
GOTO :mailerror
)
if NOT ["%errorlevel%"]==["0"] pause

REM Before doing the network connection make sure Z drive is free for use
if exist z:\ ( net use z: /delete )


REM proceed with a network connection using Z with error checking
net use Z: \\dcqwdbs034\D$\arrivals /user:sutter-chs\lawson Sutter1
if errorlevel 0 (
goto :move
) else (
SET BODY="net use connection failed"
goto :mailerror
)

REM move file to MSCM server
:move
move /Y "C:\channels\filetransfer_process\*" "Z:\"
if errorlevel 1 (
SET BODY="File not found, could not be moved/renamed or bad parameters"
goto :mailerror
)

REM remove network mapped Z drive
net use z: /delete

REM perform the error notification via BLAT
:mailerror
"D:\Program Files\BLAT\blat.exe" -Install -Server mail1.sutterhealth.org -f
name@domain.org -u name@domain.org -Pw mypasswd
"D:\Program Files\BLAT\blat.exe" -To name@domain.org.org -Subject "File
Transfer Error" -Body %BODY%
:EOF

最佳答案

这是重写的批处理文件以正确处理所有错误情况(希望没有经过全面测试)。

@echo off
REM Backup files first and report any errors if not successful
%SystemRoot%\System32\xcopy.exe "C:\channels\filetransfer_process\*" "C:\channels\backup\" /C /Q /Y >"%TEMP%\%~n0.tmp"

REM Error checking
REM Note: The environment variable ERRORLEVEL contains the
REM return code of the last executed program or script.
if errorlevel 5 SET "BODY=File write error occurred" & GOTO MailError
if errorlevel 2 SET "BODY=Not enough memory or free space" & GOTO MailError
if not errorlevel 1 pause

set "FileCount=0"
for /F "usebackq" %%I in ("%TEMP%\%~n0.tmp") do set "FileCount=%%I"
if "FileCount" == "0" SET "BODY=No files were found to copy" & GOTO MailError

REM Temporary file with number of copied files as last line no longer needed.
del "%TEMP%\%~n0.tmp"
set "FileCount="

REM Before doing the network connection make sure Z drive is free for use
%SystemRoot%\System32\net.exe use Z: /delete 2>nul

REM Proceed with a network connection using Z with error checking.
%SystemRoot%\System32\net.exe use /persistent:no
%SystemRoot%\System32\net.exe use Z: \\dcqwdbs034\D$\arrivals password /user:domain\username
if errorlevel 1 SET "BODY=Net use connection failed" & GOTO MailError
if not exist Z:\ SET "BODY=Net use connection failed" & GOTO MailError

REM Move files to MSCM server.
move /Y "C:\channels\filetransfer_process\*" "Z:\"
if errorlevel 1 (
%SystemRoot%\System32\net.exe use Z: /delete
SET "BODY=File not found, could not be moved/renamed or bad parameters"
GOTO MailError
)

REM Remove network mapped Z drive.
%SystemRoot%\System32\net.exe use Z: /delete
%SystemRoot%\System32\net.exe use /persistent:yes
goto :EOF

REM Perform the error notification via BLAT.
:MailError
%SystemRoot%\System32\net.exe use /persistent:yes
del "%TEMP%\%~n0.tmp" 2>nul
"D:\Program Files\BLAT\blat.exe" -Install -Server mail1.sutterhealth.org -f name@domain.org -u name@domain.org -Pw mypasswd "D:\Program Files\BLAT\blat.exe" -To name@domain.org.org -Subject "File Transfer Error" -Body "%BODY%"

XCOPY 使用选项 /Q 执行以抑制复制文件的输出。但是 XCOPY 仍然会输出已复制文件的数量作为最终摘要信息。此输出被重定向到一个临时文件以供以后评估。但首先是评估 XCOPY 的退出代码。

if errorlevel 2 表示命令/应用程序的退出代码是否大于或等于 2 所以if errorlevel 5 必须是第一个 IF 条件。

[] 在字符串比较中没有特殊含义。它们只是两个文字字符。所以不要将它们添加到字符串比较中。 if NOT "%errorlevel%"=="0"pause 就足够了。

双引号对命令解释器有特殊意义,作为参数字符串的开始/结束标记,其中的字符应按字面解释,%! 除外启用延迟扩展。但请注意," 在比较两个参数时始终包含在 IF 中。换句话说,if 在比较两个参数之前不会删除周围的双引号参数。

ERRORLEVEL 始终将整数值分配为字符串,因此可以安全地使用 if NOT %ERRORLEVEL% == 0 pause 使字符串比较更快一些因为只需要比较两个字节(0 的 ASCII 表示和字符串终止空字节,即 0x30、0x00)而不是四个字节(引号字节,0 的 ASCII 表示>,引用字节和字符串终止空字节,即 0x22、0x30、0x22、0x00)。

但最好使用 if not errorlevel 1,这意味着如果先前命令/应用程序的退出代码低于 1。几乎所有应用程序在成功时以 0 退出,在错误情况下以大于 0 的正数退出。因此 if not errorlevel 1 在命令 block 中工作几乎总是比 if %ERRORLEVEL% == 0 测试成功要好。

此批处理文件中使用的带有选项 /F 的命令 FOR 逐行读取指定文件中的行,跳过空行,跳过以分号开头的行, 使用默认分隔符空格和水平制表符将每一行拆分为子字符串,并将第一个空格/制表符分隔字符串分配给指定的循环变量 I。在这种情况下,这应该始终是复制文件的数量。

NET 应用程序通常不会在出现错误时以大于 0 的值退出。因此,在将网络共享映射到驱动器盘符后,最好验证驱动器 Z: 是否真的存在。最好不要将网络驱动器映射持久存储在当前用户的 Windows 注册表中。顺便说一句:有问题的代码中发布的域、用户名和密码很有可能是假数据。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • del/?
  • echo/?
  • for/?
  • goto/?
  • 移动/?
  • net/?
  • net use/?
  • 暂停/?
  • rem/?
  • 设置/?
  • xcopy/?

另见:

关于batch-file - xcopy errorlevels 返回零而不是 1 找不到要复制的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49738304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com