我尝试将批处理变量设置为另一个命令的输出。在Linux / Unix中,你可以简单地使用反引号,例如(在csh中)
set MY_VAR = `tail /etc/passwd`
Windows批处理中是否有类似的内容?
实际上我已经发现了一些东西,但它没有完全发挥作用:
d:\>for /F "skip=1" %n in ('wmic OS Get CurrentTimeZone') do set TimeZone=%n
d:\>set TimeZone=120
:\>set TimeZone=
d:\>
问题是wmic
命令返回几行,否则它会正常工作。我知道第一个跳过,但是我没有设法跳过第二个空行。我试过IF
但没有成功。
答案 0 :(得分:3)
是的 - wmic的输出有点难以处理。
使用技巧:在输出中搜索一个数字(findstr "[0-9]
将只返回包含数字的行):
for /F %n in ('wmic OS Get CurrentTimeZone ^|findstr "[0-9]"') do set TimeZone=%n
echo Timezone is %TimeZone%.
(用于批处理文件中使用%%n
代替%n
)
另一种方式是:
for /F %n in ('wmic OS Get CurrentTimeZone') do if not defined TimeZone set TimeZone=%n
编辑:
我更喜欢第一个版本,因为findstr
(或find
)转换了wmic-line-endings,因此MC ND提到的第二个for
不是必需的。
答案 1 :(得分:3)
我建议遵循批处理代码:
@echo off
for /F "skip=1" %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS Get CurrentTimeZone') do (
set "TimeZone=%%I"
goto BelowLoop
)
:BelowLoop
echo Time zone difference is: %TimeZone%
在将感兴趣的值分配给环境变量TimeZone
后,使用 GOTO 命令退出 FOR 循环。
整个 FOR 循环可以优化为单个命令行:
@echo off
for /F "skip=1" %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS Get CurrentTimeZone') do set "TimeZone=%%I" & goto BelowLoop
:BelowLoop
echo Time zone difference is: %TimeZone%
在获得感兴趣的值后退出 FOR 循环可以避免解析 WMIC 的Unicode(UTF-16 Little Endian)编码输出的问题FOR 否则会导致删除环境变量TimeZone
。有关通过 FOR 错误解析Unicode输出的详细信息,请参阅How to correct variable overwriting misbehavior when parsing output?上的答案
答案 2 :(得分:2)
for /f "tokens=2 delims==" %a in ('wmic OS get CurrentTimeZone /value') do set "timeZone=%a"
(要在批处理文件中使用,请记住将百分号加倍)
/value
中添加的wmic
会将其输出更改为key=value
格式。 delims
命令中的for
子句指示=
作为分隔符。 tokens
子句要求仅检索行中的第二个标记/字段。由于唯一包含两个令牌的行是带有所需数据的行,因此只处理此行。
但是,wmic输出包括在其输出结尾处的附加回车,需要从变量中删除。可以使用aditional for
命令。结果命令将是
for /f "tokens=2 delims==" %a in ('wmic OS get CurrentTimeZone /value') do for /f %b in ("%a") do set "timeZone=%b"
或者,对于批处理文件
for /f "tokens=2 delims==" %%a in (
'wmic OS get CurrentTimeZone /value'
) do for /f %%b in ("%%a") do set "timeZone=%%b"
echo %timeZone%