- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下 bat,test.bat(PC01 已关闭):
mkdir \\PC01\\c$\Test || goto :eof
> test.bat || echo 99
> if ERRORLEVEL 1 echo 55
||
运算符(operator)没有看到它。
cmd /c -
运行那个 bat
> cmd /c test.bat || echo 99
> if ERRORLEVEL 1 echo 55
|| goto :eof
,一切都会像人们预测的那样工作——即输出将是
最佳答案
在大多数情况下, ||
is the most reliable way to detect an error 。但是您偶然发现了 ERRORLEVEL 有效但 ||
无效的罕见情况之一。
问题源于您的错误是在批处理脚本中引发的,并且 ||
响应了最近执行的命令的返回码。您将 test.bat 视为单个“命令”,但实际上它是一系列命令。脚本中执行的最后一个命令是 GOTO :EOF
,并且成功执行。所以你的 test.bat||echo 99
正在响应 GOTO :EOF
的成功。
当您从脚本中删除 ||GOTO :EOF
时,您的 test.bat||echo99
会看到失败的 mkdir
的结果。但是如果你在 test.bat 的末尾添加 REM
命令,那么 test.bat||echo 99
会响应 REM
的成功,并且错误会再次被屏蔽。
ERRORLEVEL 在 test.bat||echo 99
之后仍然是非零的,因为像 GOTO
和 REM
这样的命令在成功后不会清除任何先前的非零 ERRORLEVEL。这是 ERRORLEVEL 和返回码并非完全相同的众多证据之一。它肯定会让人感到困惑。
您可以将 test.bat 视为一个单元命令,并通过使用 CALL 获得您想要的行为。
C:\test>call test.bat && echo OK || echo FAIL
FAIL
C:\test>if ERRORLEVEL 1 (echo FAIL2) else echo OK2
FAIL2
CALL
命令暂时将控制转移到被调用的脚本。当脚本终止时,控制返回到
CALL
命令,并返回当前的 ERRORLEVEL。所以
||echo 99
正在响应 CALL 命令本身返回的错误,而不是脚本中的最后一个命令。
CMD /C
问题。
CMD /C
返回的返回码是最后执行的命令的返回码。
C:\test>cmd /c call test.bat && echo OK || echo FAIL
FAIL
C:\test>if ERRORLEVEL 1 (echo FAIL2) else echo OK2
FAIL2
CMD /C
返回的是
CALL
语句返回的ERRORLEVEL
C:\test>cmd /c test.bat && echo OK || echo FAIL
OK
C:\test>if ERRORLEVEL 1 (echo FAIL2) else echo OK2
OK2
CALL
,
CMD /C
返回最后执行的命令的返回码,即
GOTO :EOF
。
CMD /C
还将 ERRORLEVEL 设置为相同的返回代码,因此现在没有证据表明脚本中曾经存在错误。
||
有时会清除 ERRORLEVEL。他提供了似乎支持他的结论的证据。但情况并没有那么简单,事实证明
||
是检测错误的最可靠(但仍不完美)的方法。
help exit
或
exit /?
)
EXIT [/B] [exitCode]
/B specifies to exit the current batch script instead of
CMD.EXE. If executed from outside a batch script, it
will quit CMD.EXE
exitCode specifies a numeric number. if /B is specified, sets
ERRORLEVEL that number. If quitting CMD.EXE, sets the process
exit code with that number.
help bogus
),则返回 0 ,但如果您请求有效命令的帮助(如
help rem
),则返回 1 。
||
运算符从不清除 ERRORLEVEL。检测到进程退出代码并在它非零时触发
||
,并且 ERRORLEVEL 仍将与退出代码匹配。话虽如此,出现在
&&
和/或
||
之后的命令可能会修改 ERRORLEVEL,因此必须小心。
<
、 >
和 >>
(call )
带有空格,是一种神秘的语法,可以在每次测试之前将 ERRORLEVEL 清除为 0。稍后,我还将使用
(call)
,不带空格,将 ERRORLEVEL 设置为 1
cmd /v: on
在运行我的测试之前
||
。在这些情况下,
||
从不清除或修改 ERRORLEVEL。
C:\test>(call ) & set /a 1/0
Divide by zero error.
C:\test>echo !errorlevel!
1073750993
C:\test>(call ) & type notExists
The system cannot find the file specified.
C:\test>echo !errorlevel!
1
C:\test>(call ) & set /a 1/0 && echo OK || echo ERROR !errorlevel!
Divide by zero error.
ERROR 1073750993
C:\test>(call ) & type notExists.txt && echo OK || echo ERROR !errorlevel!
The system cannot find the file specified.
ERROR 1
||
的重定向运算符,但除非使用
||
,否则不要设置 ERRORLEVEL。
C:\test>(call ) & rd notExists
The system cannot find the file specified.
C:\test>echo !errorlevel!
0
C:\test>(call ) & echo x >\badPath\out.txt
The system cannot find the path specified.
C:\test>echo !errorlevel!
0
C:\test>(call ) & rd notExists && echo OK || echo ERROR !errorlevel!
The system cannot find the file specified.
ERROR 2
C:\test>(call ) & echo x >\badPath\out.txt && echo OK || echo ERROR !errorlevel!
The system cannot find the path specified.
ERROR 1
||
也不会设置非零的 ERRORLEVEL。
||
或将 ERRORLEVEL 设置为非零
C:\test>(call ) & del readOnlyFile
C:\test\readOnlyFile
Access is denied.
C:\test>echo !errorlevel!
0
C:\test>(call ) & del readOnlyFile & echo OK || echo ERROR !errorlevel!
C:\test\readOnlyFile
Access is denied.
OK
||
不会触发,并且 ERRORLEVEL 未设置为非零。有关更多信息,请参阅
http://www.dostips.com/forum/viewtopic.php?f=3&t=6881。
CALL
,
||
操作符会响应脚本中执行的最后一个命令。使用
CALL
,
||
运算符响应
CALL
命令返回的值,这是批处理终止时存在的最终 ERRORLEVEL。
||
,则报告为 ERRORLEVEL 1。
C:\test>(call ) & InvalidCommand
'InvalidCommand' is not recognized as an internal or external command,
operable program or batch file.
C:\test>echo !errorlevel!
9009
C:\test>(call ) & InvalidCommand && echo OK || echo ERROR !errorlevel!
'InvalidCommand' is not recognized as an internal or external command,
operable program or batch file.
ERROR 1
||
在设置 9009 之前拦截了错误检测,此时它将它设置为 1。所以我不认为
||
正在清除 9009 错误,而是它是处理和设置错误的替代途径。
||
随后可以检测到 1 返回码并将 ERRORLEVEL 设置为匹配,从而覆盖 9009。
||
而异。
.bat
的批处理脚本还是从扩展名为
.cmd
的批处理脚本执行。
call echo OK
EXIT /B 0
清除 ERRORLEVEL,但没有值的 EXIT /B
保留先前的 ERRORLEVEL。 .bat
的脚本发出,这些命令在成功时不会清除 ERRORLEVEL,但如果从扩展名为
.cmd
的脚本发出,则将 ERRORLEVEL 清除为 0。有关更多信息,请参阅
https://stackoverflow.com/a/148991/1012053 和
https://groups.google.com/forum/#!msg/microsoft.public.win2000.cmdprompt.admin/XHeUq8oe2wk/LIEViGNmkK0J。
&&
运算符都会检测前一个命令是否成功,如果成功则仅执行后续命令。
&&
运算符忽略 ERRORLEVEL 的值,并且从不修改它。
&&
总是会触发,即使 ERRORLEVEL 不为零。 CD 命令是该命令清除任何先前的 ERRORLEVEL 的示例,而 ECHO 命令是该命令不清除先前的 ERRORLEVEL 的示例。请注意,在发出成功的命令之前,我使用
(call)
将 ERRORLEVEL 强制为 1。
C:\TEST>(call)
C:\TEST>echo !errorlevel!
1
C:\test>(call) & cd \test
C:\test>echo !errorlevel!
0
C:\test>(call) & cd \test && echo OK !errorlevel! || echo ERROR !errorlevel!
OK 0
C:\test>(call) & echo Successful command
Successful command
C:\test>echo !errorlevel!
1
C:\test>(call) & echo Successful command && echo OK !errorlevel! || echo ERROR !errorlevel!
Successful command
OK 1
&&
或
||
之后使用其他命令时可能发生的情况的示例。
@echo off
setlocal enableDelayedExpansion
(call)
echo ERRORLEVEL = !errorlevel!
(call) && echo OK !errorlevel! || echo ERROR !errorlevel!
(call) && (echo OK !errorlevel! & set "err=0") || (echo ERROR !errorlevel! & set "err=1" & echo ERROR !errorlevel!)
echo ERRORLEVEL = !errorlevel!
echo ERR = !ERR!
.bat
扩展名时的输出:
C:\test>test.bat
ERRORLEVEL = 1
ERROR 1
ERROR 1
ERROR 1
ERRORLEVEL = 1
ERR = 1
.cmd
扩展名时的输出:
C:\test>test.cmd
ERRORLEVEL = 1
ERROR 1
ERROR 1
ERROR 0
ERRORLEVEL = 0
ERR = 1
&&
和
||
是检测命令成功或失败的最可靠方法,但如果您关心 ERRORLEVEL 值,则必须注意在这些运算符之后使用哪些命令。
&&
和
||
是检测成功和失败的最可靠方法。
&&
和
||
都不直接修改ERRORLEVEL。但也有一些罕见的异常(exception)。
||
正确设置 ERRORLEVEL,否则当 RD 或重定向失败 ||
在无效命令执行失败时设置不同的 ERRORLEVEL,如果未使用 ||
(1 对 9009),则会发生。 ||
不会检测由批处理脚本返回的非零 ERRORLEVEL 作为错误。
if errorlevel 1 ...
或
if %errorlevel% neq 0 ...
来检测错误,那么您将面临错过 RD 和重定向(以及其他?)可能引发的错误的风险,并且您还冒着错误地认为某些内部命令失败的风险,而实际上它可能会失败是先前失败的命令的保留。
关于windows - 批量转到丢失错误级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34936240/
为什么我可以在控制台 window.window.window.window 中执行此操作并无限追加 .window 并返回 DOM 窗口? 最佳答案 因为 window 对象有一个指向它自身的 wi
Windows管理员用户和系统用户之间有什么权限区别吗? 有些时候,我必须将 cmd 窗口提升到系统权限才能删除一些文件。这可能是因为系统用户锁定了文件,或者系统用户可能具有更高的访问权限,我希望找出
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
Windows 服务和 Windows 进程之间的区别是什么? 最佳答案 服务是真正的 Windows 进程,没有区别。服务的唯一特殊之处在于它由操作系统启动并在单独的 session 中运行。一个独
我有一个 Windows 网络 (peer-2-peer) 以及 Active Directory,我需要记录向服务器发送任何类型打印的用户的名称。我想编写一个程序来记录他们的用户名和/或他们各自的
当我让一个 Windows 服务尝试安装另一个 Windows 服务时遇到问题。 具体来说,我有一个 TeamCity 代理在 Windows 2008 AWS 实例上为我运行测试。这些测试是用 Ja
我创建了一个应用程序来接收广播的 Windows 消息,效果很好。当我把它变成一个服务、安装它并启动服务时,该服务没有收到消息。 最佳答案 服务可能必须被授予访问桌面的权限。从服务属性、“登录”选项卡
我正在使用 Delphi 2010 编写应用程序。我希望在 Windows 启动时启动我的应用程序。我需要它在最新版本的 Windows XP、7.0 和最新的服务器中工作。 将其存储在以下关键工作下
我想开发一个适用于所有三个版本的 Windows XP、Vista 和 7 的应用程序。该应用程序允许人们选择要打开的文件,并允许他们在某些操作后保存文件。三个版本的 Windows 中的每一个都有不
对于\Windows\中的文件类型与\Windows\System32 中的文件类型是否有标准约定? 我正在开发一个 SDK,其中包含各种 DLL、帮助程序 exe 和 Windows 服务 exe。
要求是,必须在 WINDOWS7 机器上配置自动登录,但是这个自动登录应该等待(即延迟)直到另一个 Windows 服务发出继续自动登录的信号。 我使用了自定义凭据提供程序,它在其中等待另一个 Win
很抱歉,这不是一个大问题,而是更多的帮助人们解决这些特定问题的方法。我正在解决的问题要求使用串行I/O,但主要在Windows CE 6.0下运行。但是,最近有人问我是否也可以在Windows下运行该
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
不幸的是 SC 命令在 W2000 上还不可用,所以我不能使用它。 我正在尝试检查服务是否在 W2000 服务器上运行,如果它没有运行,脚本应该能够启动该服务。 如何在 Windows 2000 上执
如何在登录到 Windows 之前启动 Windows 窗体应用程序?是否可以在登录到 Windows 之前启动 Windows 窗体应用程序?如果不是,我是否有机会在登录前启动 Windows 服务
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我想在 XML 文件中区分 Windows XP 和 Windows 7。我想我会在 XML 中为它使用一个环境变量。 但是我找不到在 Windows 中定义的任何系统环境变量来提供此信息。 我看到了
有谁知道我可以在注册表中的哪个位置检查机器上是否安装了这些应用程序: Windows 通讯录 Windows 联系人 最佳答案 来自 Microsoft:我知道它说的是 win 95,但 reg 是一
我正在尝试从我的 Windows 服务器调用放置在远程 Windows 服务器上的批处理文件。我在远程服务器上安装了 freeSSHd。我尝试使用 putty/plink 但没有结果。 我使用的命令语
( 大家好。我是 Windows 编程的新手,所以如果已经有人问过我,我提前道歉,我只是不知道要搜索什么,但这个问题一直让我发疯,我知道有人可能真的很容易回答这个问题。) 我的公司有一个在 Windo
我是一名优秀的程序员,十分优秀!