将命令输出分配给batch file中的variables

我试图将一个命令的输出分配给一个variables – 在我试图将当前的Flash版本设置为一个variables。 我知道这是错的,但这是我所尝试过的:

设置var = reg查询hklm \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion>

要么

reg query hklm \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion >> set var

是的,你可以看到我有点失落。 任何和所有的帮助表示赞赏!

一个方法已经被devise出来,但是这样你不需要临时文件。

for /f "delims=" %%i in ('command') do set output=%%i 

不过,我相信这有它自己的例外和限制。

这篇文章有一个方法来实现这一点

from(zvrba)你可以通过首先将输出redirect到一个文件来完成。 例如:

 echo zz > bla.txt set /p VV=<bla.txt echo %VV% 

你不能直接把一个过程输出分配给一个var,你需要用一个For / F循环来parsing输出:

 @Echo OFF FOR /F "Tokens=2,*" %%A IN ( 'Reg Query "HKEY_CURRENT_USER\Software\Macromedia\FlashPlayer" /v "CurrentVersion"' ) DO ( REM Set "Version=%%B" Echo Version: %%B ) Pause&Exit 

http://ss64.com/nt/for_f.html

PS:如果需要,更改使用的注册码。

好的,这里有一些比较复杂的使用For / F的例子

 :: Main @prompt -$G call :REGQUERY "Software\Classes\CLSID\{3E6AE265-3382-A429-56D1-BB2B4D1D}" @goto :EOF :REGQUERY :: Checks HKEY_LOCAL_MACHINE\ and HKEY_CURRENT_USER\ :: for the key and lists its content @call :EXEC "REG QUERY HKCU\%~1" @call :EXEC "REG QUERY "HKLM\%~1"" @goto :EOF :EXEC @set output= @for /F "delims=" %%i in ('%~1 2^>nul') do @( set output=%%i ) @if not "%output%"=="" ( echo %1 -^> %output% ) @goto :EOF 

我将它打包到子函数EXEC中,所以它的所有讨厌的实现细节都不会抛弃主要的脚本。 所以它有一些有点批处理教程。 笔记'的代码:

  1. 通过调用:EXEC 命令执行的命令的 输出存储在%output%中批cmd不关心作用域,所以%output%也可以在主脚本中使用。
  2. @开始只是装饰,并抑制回应命令行。 你可以删除它们,只是把一些@echoclosures在第一行是真的不喜欢的。 但是,像这样,我发现debugging更好。 装饰第二个是提示 – $ G。 在那里使命令提示符看起来像这样– >
  3. 我使用::而不是rem
  4. %〜1中的代字号(〜)是从第一个参数中删除引号
  5. 2 ^> nul是抑制/丢弃stderr错误输出。 通常你会通过2> nul来做。 那么^批处理转义字符就是避免早日解决redirect(>)。 有一些simulare在脚本稍后使用: echo %1 -^>...所以有可能通过回声输出一个'>'什么是不可能的。
  6. 即使比较在@if not "%output%"==""看起来像在最常见的编程语言 – 它可能不同于你的预期(如果你不习惯MS批处理)。 那么在开始时删除“@”。 研究输出。 将其更改为not %output%=="" rerun,并考虑为什么这不起作用。 ;)