如何将批处理变量设置为另一个脚本的输出

时间:2014-08-16 13:41:25

标签: variables batch-file output

我尝试将批处理变量设置为另一个命令的输出。在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但没有成功。

3 个答案:

答案 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%