sdb*_*bbs 6 windows command-line environment-variables cmd.exe
考虑这个例子,我开始一个新的“子”实例cmd.exe,然后尝试在其中设置一个新的环境变量,然后检查它是否设置了正确的值(这是在cmd.exeWindows 10 中):
>cmd /c "SET OPERATION=NEW & SET O"
OneDrive=C:\Users\user\OneDrive
OPERATION=NEW
OS=Windows_NT
Run Code Online (Sandbox Code Playgroud)
因此,如https://superuser.com/a/776506/688965 中所述- 通过这样做,SET O我将“显示以字母 'O' 开头的所有变量”,实际上,它表明OPERATION存在一个环境变量,并且它的值是NEW。到现在为止还挺好。
但是,如果我尝试打印环境的值来代替,它并没有扩大:
>cmd /c "SET OPERATION=NEW & echo %OPERATION%"
%OPERATION%
Run Code Online (Sandbox Code Playgroud)
...但是,如果我尝试扩展任何其他环境变量,它会起作用吗?!:
>cmd /c "SET OPERATION=NEW & echo %OS%"
Windows_NT
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?如何设置环境变量,然后echo在cmd.exe子shell中在一行中打印它?
要在 cmd 子外壳中启用必要的延迟扩展,您必须使用cmd.exe的/V:ON开关并使用感叹号而不是百分号。!%
> cmd /V:ON /C "SET OPERATION=NEW&echo [!OPERATION!]"
[NEW]
Run Code Online (Sandbox Code Playgroud)
提醒
一下原始集合中的尾随空格将是变量内容的一部分:
> cmd /V:ON /C "SET OPERATION=NEW &echo [!OPERATION!]"
[NEW ]
Run Code Online (Sandbox Code Playgroud)
该%OPERATION%被扩展(阶段1)的变量已被前组(阶段7)。
请参阅Windows 命令解释器 (CMD.EXE) 如何解析脚本?血腥细节:
处理批处理文件中的一行代码涉及多个阶段。
以下是各个阶段的简要概述:
阶段 0) 读取行:
阶段 1) 百分比扩张:
阶段 1.5) 删除:删除所有回车 (0x0D) 字符
阶段 2) 处理特殊字符、标记化并构建缓存命令块:这是一个复杂的过程,受引号、特殊字符、标记分隔符和脱字符转义等因素的影响。
阶段 3) 回显解析的命令 仅当命令块不以 @ 开头,并且 ECHO 在上一步开始时为 ON。
阶段 4) FOR %X 变量扩展:仅当 FOR 命令处于活动状态并且正在处理 DO 之后的命令时。
阶段 5)延迟扩展:仅当启用延迟扩展时
阶段 5.3) 管道处理:仅当命令位于管道的任一侧时
阶段 5.5) 执行重定向:
阶段 6) CALL 处理/插入符加倍:仅当命令标记为 CALL 时
阶段7)执行:命令被执行
| 归档时间: |
|
| 查看次数: |
5162 次 |
| 最近记录: |