使用Windows批处理文件中的命令结果设置变量的值

时间:2009-05-20 18:34:42

标签: windows batch-file

Bash 环境中工作时,要将变量的值设置为命令的结果,我通常会这样做:

var=$(command -args)

其中var是由命令command -args设置的变量。然后,我可以将该变量作为$var访问。

与几乎每个Unix shell兼容的更常规的方法是:

set var=`command -args`

那就是说,如何在 Windows批处理文件中使用命令的结果设置变量的值?我试过了:

set var=command -args

但是我发现var设置为command -args而不是命令的输出。

6 个答案:

答案 0 :(得分:59)

要执行Jesse describes,您需要编写Windows批处理文件:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

但是,如果您习惯使用Unix类型的脚本,我建议您在Windows系统上使用Cygwin

答案 1 :(得分:33)

由于Windows批处理命令:

,因此需要注意一点
for /f "delims=" %%a in ('command') do @set theValue=%%a

与Unix shell语句没有相同的语义:

theValue=`command`

考虑命令失败的情况,导致错误。

在Unix shell版本中,仍然会发生对“theValue”的赋值,任何以前的值都被替换为空值。

在Windows批处理版本中,它是处理错误的“for”命令,并且永远不会达到“do”子句 - 因此将保留“theValue”的任何先前值。

要在Windows批处理脚本中获得更多类似Unix的语义,必须确保进行分配:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

将Unix脚本转换为Windows批处理时,无法清除变量值可能会导致细微错误。

答案 2 :(得分:17)

当我在批处理文件中需要数据库查询结果时,我就是这样做的:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

键在第2行:“set / p”通过“&lt;”将“result”的值设置为“__query.tmp”中第一行(仅)的值重定向运算符。

答案 3 :(得分:12)

我见过它的唯一方法就是你这样做:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver是Windows的版本命令,在我的系统上生成:

Microsoft Windows [Version 6.0.6001]

Source

答案 4 :(得分:0)

Set "dateTime="
For /F %%A In ('powershell get-date -format "{yyyyMMdd_HHmm}"') Do Set "dateTime=%%A"
echo %dateTime%
pause

enter image description here Official Microsoft docs用于for命令

答案 5 :(得分:0)

有两种方法:

@echo off

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;;set "[[=>"#" 2>&1&set/p "&set "]]==<# & del /q # >nul 2>&1" &::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: --examples

::assigning chcp command output to %code-page% variable
chcp %[[%code-page%]]%
echo 1: %code-page%

::assigning whoami command output to %its-me% variable
whoami %[[%its-me%]]%
echo 2: %its-me%


::::::::::::::::::::::::::::::::::::::::::::::::::
;;set "{{=for /f "tokens=* delims=" %%# in ('" &::
;;set "--=') do @set ""                        &::
;;set "}}==%%#""                               &::
::::::::::::::::::::::::::::::::::::::::::::::::::

:: --examples

::assigning ver output to %win-ver% variable
%{{% ver %--%win-ver%}}%
echo 3: %win-ver%


::assigning hostname output to %my-host% variable
%{{% hostname %--%my-host%}}%
echo 4: %my-host%