Batch file Windows%ERRORLEVEL%==美元吗?在Linux中

Batch file Windows%ERRORLEVEL%==美元吗?在Linux中,batch-file,Batch File,正在尝试windows批处理文件,在下面的代码中,我在www @ECHO OFF REM Call this with two arguments, and it will add them. SET a=%1+%2 IF %ERRORLEVEL%==0 (goto errors-0) ELSE (goto errors-1) REM Instead of using goto with the variable, this uses an IF-ELSE structure :errors-0

正在尝试windows批处理文件,在下面的代码中,我在www

@ECHO OFF
REM Call this with two arguments, and it will add them.
SET a=%1+%2
IF %ERRORLEVEL%==0 (goto errors-0) ELSE (goto errors-1)
REM Instead of using goto with the variable, this uses an IF-ELSE structure
:errors-0
REM This is if it was successful
ECHO %a%
goto exit
:errors-1
REM this is if it had an error:
ECHO Errors occurred.
goto exit
REM GUESS WHAT, THIS REM WILL NEVER EVER BE READ!  IT WILL BE SKIPPED OVER BY THE GOTOS
:exit
ECHO.
ECHO press any key to exit.
PAUSE>nul
假设代码接受2个参数,添加它们并回显结果

但这不会在我的Windows 8.1计算机上成功执行。以下是我得到的:

C:\ProjectDoc>add3.bat
Errors occurred.

press any key to exit.
因此,U为
ERRORLEVEL
添加了一个echo,以在执行命令
SET
后查看其值。以下是输出:

C:\ProjectDoc>add3.bat 2 3
9009
Errors occurred.

press any key to exit.
C:\ProjectDoc>

那么,Windows中的
errorlevel
是否等于Linux的
$?
。它是否应该为命令的每次成功执行返回0,还是不同?阅读一些文档将其与Linux中的
$?
联系起来,但它在Linux中的工作方式显然不是
$?

是的,准确地说,%errorlevel%类似于$?在bashshell中

在批处理文件中,
设置a=%1+%2
没有执行您希望它执行的操作。它只是将变量
a
的值设置为字符串“2+3”,假设您使用参数
23
运行文件。如果要进行算术运算,需要使用/A选项:
set/A=%1+%2

SET命令(以及许多其他内置命令)仅在实际发生错误时设置ERRORLEVEL。如果成功,ERRORLEVEL将保留其以前的值。我想这就是你在问题中看到的

相反,当命令运行可执行文件时,当进程完成时,它总是设置ERRORLEVEL

除了检查ERRORLEVEL变量的特定值外,使用以下表达式检查ERRORLEVEL也是惯用方法(出于历史原因

IF ERRORLEVEL 1 ECHO Hello


如果
ERRORLEVEL
为1或更高,这将运行给定的命令-换句话说,如果发生任何错误。

Yes,准确地说,%ERRORLEVEL%类似于$?在bashshell中

在批处理文件中,
设置a=%1+%2
没有执行您希望它执行的操作。它只是将变量
a
的值设置为字符串“2+3”,假设您使用参数
23
运行文件。如果要进行算术运算,需要使用/A选项:
set/A=%1+%2

SET命令(以及许多其他内置命令)仅在实际发生错误时设置ERRORLEVEL。如果成功,ERRORLEVEL将保留其以前的值。我想这就是你在问题中看到的

相反,当命令运行可执行文件时,当进程完成时,它总是设置ERRORLEVEL

除了检查ERRORLEVEL变量的特定值外,使用以下表达式检查ERRORLEVEL也是惯用方法(出于历史原因

IF ERRORLEVEL 1 ECHO Hello


如果
ERRORLEVEL
为1或更高,这将运行给定的命令—换句话说,如果发生了任何错误。

在第一行打开
Echo,您将看到发生了什么。问题是“对于unix/linux,ERRORLEVEL是否等于$?”?如果你理解我的问题一般来说是的,
ErrorLevel
是返回代码,表示成功,返回代码为
0
;然而,问题是命令使用它的方式不同:有些命令在出错时设置它,但在成功时不重置它(例如,
set
);有些会重置它(例如,
复制
);有些人甚至使用非零数字表示成功,以表示结果(
选项
)…它是否“在unix/linux中等同于$?”取决于您在unix/linux中使用的shell。请阅读
SET
命令的帮助。此外,dos标记对此问题无效。在第一行打开
Echo,您将看到发生了什么。问题是“对于unix/linux,errorlevel是否等于$?”?如果你理解我的问题一般来说是的,
ErrorLevel
是返回代码,表示成功,返回代码为
0
;然而,问题是命令使用它的方式不同:有些命令在出错时设置它,但在成功时不重置它(例如,
set
);有些会重置它(例如,
复制
);有些人甚至使用非零数字表示成功,以表示结果(
选项
)…它是否“在unix/linux中等同于$?”取决于您在unix/linux中使用的shell。请阅读
SET
命令的帮助。此外,dos标记对此问题无效。同意语法为:
SET a=%1+%2
的命令由于缺少选项
/a
而未执行所需的算术运算。但是这样的命令(没有
/a
开关)没有错误。它将值设置为字符串
“2+3”
。因此,在Linux环境中,
$?
将为此返回0。但windows批处理设置/保留值9009。为什么会这样?虽然我认为,这就是你在回答的第三段想说的<代码>“SET命令(以及许多其他内置命令)仅在出现错误时设置错误级别……”
@OK9999。错误值9009一定是以前某个操作遗留下来的,因为SET命令成功,所以它没有更改此错误值。cmd.exe充满了怪癖。同意语法为:
SET a=%1+%2
的命令由于缺少选项
/a
而无法执行所需的算术运算。但是这样的命令(没有
/a
开关)没有错误。它将值设置为字符串
“2+3”
。因此,在Linux环境中,
$?
将为此返回0。但windows批处理设置/保留值9009。为什么会这样?虽然我认为,这就是你在回答的第三段想说的<代码>“SET命令(以及许多其他内置命令)仅在出现错误时设置错误级别……”
@OK9999。错误值9009必须是以前某个操作留下的,因为