您看到的问题源于 WMIC 输出为 unicode 的事实。<CR>
通过某种我不完全理解的机制(错误?), FOR /F 命令将 unicode 命令输出转换为 ASCII,但在每行的末尾神秘地附加了一个额外的回车符 ( )。
FOR /F 不返回空行,但神秘且看似空白的行并不是真正的空白 - 它们包含一个<CR>
.
即使额外的行被正确忽略,列表中的最后一个值也会包含一个不需要<CR>
的值,在将值分配给环境变量时会包含该值。如果稍后使用正常扩展变量,<CR>
则不会明显,%VAR%
因为命令解析器会自动去除所有<CR>
字符。但是<CR>
如果使用延迟扩展,它会被保留并且可能会导致问题!VAR!
。
FOR /F 命令从每行中删除最后一个字符,如果它恰好是<CR>
. 因此,通过额外的 FOR /F 传递值将消除问题。David Ruhman 的使用/value
switch 的建议是一个很好的建议,并且可以改进。一个循环可以请求多个值,属性名可以作为变量名。每行只有一个名称/值对消除了值中空格和/或逗号的潜在解析问题。
WMIC 命令中的逗号在 FOR /F 中使用时必须转义或引用。在这种情况下,引用整个命令似乎是最简单的。以下将正确定义两个环境变量 - 域和名称:
for /f "delims=" %%A in ('"wmic computersystem get domain, name /value"') do (
for /f "tokens=1* delims==" %%B in ("%%A") do set "%%B=%%C"
)
echo Your host name is %name% and your domain is %domain%