Variables 如何将批处理变量设置为另一个脚本的输出
我尝试将批处理变量设置为另一个命令的输出。在Linux/Unix中,您可以简单地使用backticks,例如(在csh中) windows批处理中是否有类似的功能 事实上,我已经发现了一些东西,但它并没有完全起作用: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
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循环,可以避免FOR对WMIC的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循环,可以避免FOR对WMIC的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%