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

Variables 如何将批处理变量设置为另一个脚本的输出,variables,batch-file,output,Variables,Batch File,Output,我尝试将批处理变量设置为另一个命令的输出。在Linux/Unix中,您可以简单地使用backticks,例如(在csh中) windows批处理中是否有类似的功能 事实上,我已经发现了一些东西,但它并没有完全起作用: d:\>for /F "skip=1" %n in ('wmic OS Get CurrentTimeZone') do set TimeZone=%n d:\>set TimeZone=120 :\>set TimeZone= d:\> 问题是w

我尝试将批处理变量设置为另一个命令的输出。在Linux/Unix中,您可以简单地使用backticks,例如(在csh中)

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
,但没有成功。

是-wmic的输出有点难以处理

使用技巧:在输出中搜索数字(
findstr“[0-9]”
只返回包含数字的行):

(在批处理文件中使用
%%n
而不是
%n

另一种方式是:

for /F %n in ('wmic OS Get CurrentTimeZone') do if not defined TimeZone set TimeZone=%n
编辑:


我更喜欢第一个版本,因为
findstr
(或
find
)转换wmic行结束符,所以前面提到的
的第二个
是不必要的。

是-wmic的输出处理起来有点难看

使用技巧:在输出中搜索数字(
findstr“[0-9]”
只返回包含数字的行):

(在批处理文件中使用
%%n
而不是
%n

另一种方式是:

for /F %n in ('wmic OS Get CurrentTimeZone') do if not defined TimeZone set TimeZone=%n
编辑:


我更喜欢第一个版本,因为
findstr
(或
find
)转换wmic行结束符,因此不需要前面提到的
的第二个

我建议使用以下批处理代码:

@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%
将感兴趣的值分配给环境变量
时区后,使用命令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循环,可以避免FORWMIC的Unicode(UTF-16小端)编码输出进行错误解析的问题,否则将导致删除环境变量
时区。有关错误解析Unicode输出的详细信息,请参见上的答案,我建议使用以下批处理代码:

@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%
将感兴趣的值分配给环境变量
时区后,使用命令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循环,可以避免FORWMIC的Unicode(UTF-16小端)编码输出进行错误解析的问题,否则将导致删除环境变量
时区。有关错误解析Unicode输出的详细信息,请参见

(要在批处理文件中使用,请记住将百分号加倍)

wmic
中添加的
/value
将其输出更改为
key=value
格式。
for
命令中的
delims
子句指示一个
=
作为分隔符。
tokens
子句要求仅检索行中的第二个令牌/字段。由于只有包含两个标记的行是包含所需数据的行,因此仅处理该行

但是,wmic输出在其输出的末尾包含一个传统的回车符,该回车符需要从变量中删除。可以使用传统的
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%
(要在批处理文件中使用,请记住将百分号加倍)

wmic
中添加的
/value
将其输出更改为
key=value
格式。
for
命令中的
delims
子句指示一个
=
作为分隔符。
tokens
子句要求仅检索行中的第二个令牌/字段。由于只有包含两个标记的行是包含所需数据的行,因此仅处理该行

但是,wmic输出在其输出的末尾包含一个传统的回车符,该回车符需要从变量中删除。可以使用传统的
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%