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


98

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

var=$(command -args)

var该命令设置的变量在哪里command -args。然后,我可以通过访问该变量$var

与几乎所有Unix shell兼容的更常规的实现方法是:

set var=`command -args`

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

set var=command -args

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

Answers:


62

要执行Jesse描述的操作,需要从Windows批处理文件中编写:

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

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


19
for /f "delims=" %a in ('ver') do @set foobar=%a在命令提示符下使用。for /f "delims=" %%a in ('ver') do @set foobar=%%a在脚本文件中使用
georg 2013年

轻巧的替代品是Windows上的Gnu(github.com/bmatzelle/gow/wiki)。只需打开命令提示符并运行bash。然后,您可以编写bash命令。您还可以执行bash脚本。
内森

4
请注意,如果您的命令包含管道,则需要使用插入符号对其进行转义,例如:对于/ f“ delims =” %% a in('echo foobar ^ | sed -es / foo / fu /'),请执行@设定foobar = %% a
yoyo'Yap

35

由于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
感谢您解释Windows和* nix之间的细微差别。
Jeroen Wiert Pluimers 2013年

3
还要记住转义其中的任何特殊字符command;例如:for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a
Bill_Stewart

@Bill_Stewart,您刚刚保存了我的一天,有一段时间我认为将管道命令的输出分配给变量要困难得多
MrBrody

19

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

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

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


14

我看到它完成的唯一方法是:

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

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

Microsoft Windows [Version 6.0.6001]

资源


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.