如果您想将最终退出代码存储在一个cmd.exe
变量中以供以后使用exit
,请不要尝试设置ERRORLEVEL
;相反,使用自定义变量名称;例如,ec
(对于退出代码):
# Execute in PowerShell
PS> cmd /v /c 'set "ec=3" & echo ... & exit /b !ec!'; $LASTEXITCODE
...
3
cmd.exe
侧面:
作为单个语句的一部分,使用运算符对命令进行排序(无条件地一个接一个地执行) 。&
在 PowerShell 方面:
有谁知道为什么该命令SET %ERRORLEVEL% = 4
不起作用?
总结问题评论中的有用信息:
set %ERRORLEVEL% = 4
通过在命令序列的开头进行%ERRORLEVEL%
反射,上述赋值创建了一个按字面命名的变量(即,后跟一个空格的值),其值为(即后跟一个空格)。0
0
%ERRORLEVEL%
4
4
中的变量cmd.exe
:
从根本上说,除了下面讨论的例外,变量cmd.exe
都是环境变量。
与 Bash 和 PowerShell 等shell 不同,子进程看不到的shell局部变量没有单独的命名空间。
这具有以下含义:
自定义变量是超出流程范围的仅限流程的环境变量cmd.exe
;必须通过注册表创建和修改持久性环境变量定义,例如使用实用程序。setx.exe
除了预定义(持久)环境变量和自定义(仅限会话)环境变量之外,cmd.exe
还维护动态伪环境变量,例如%ERRORLEVEL%
和%RANDOM%
(参见下面的列表):
注意:严格来说,这些动态变量只有在所谓的命令扩展打开的情况下才能启用,但默认情况下是这样(您可以使用 禁用它们/E:OFF
,但这是不明智的)。
因为这些动态变量严格来说不是子进程继承其副本的进程环境的一部分,所以它们不是环境变量,尽管help SET
有些混淆地称它们为动态环境变量。
您不应该(也不能)修改这些变量。
如果您尝试,真正发生的是您使用真实的自定义环境变量来隐藏(覆盖)这些伪变量,这些环境变量根据定义具有静态值。
因此,依赖于该名称的变量以具有其通常的动态行为的后续代码可能会出现故障。
在 Windows 10 上通过以下方式检索到的动态变量列表help SET
(强调):
如果启用了命令扩展,则有几个动态环境变量可以扩展,但它们不会显示在 显示的变量列表中SET
。每次扩展变量的值时,都会
动态计算这些变量值
。如果用户明确定义了具有这些名称之一的变量,则该定义将覆盖下面描述的动态变量:
%CD%
- 扩展到当前目录字符串。
%DATE%
- 使用与 DATE 命令相同的格式扩展到当前日期。
%TIME%
- 使用与 TIME 命令相同的格式扩展到当前时间。
%RANDOM%
- 扩展为 0 到 32767 之间的随机十进制数。
%ERRORLEVEL%
- 扩展到当前的 ERRORLEVEL 值
%CMDEXTVERSION%
- 扩展到当前的命令处理器扩展版本号。
%CMDCMDLINE%
- 扩展到调用命令处理器的原始命令行。
%HIGHESTNUMANODENUMBER%
- 扩展到这台机器上最高的 NUMA 节点号。