2013-04-24 161 views
38

我试图将一个命令的输出分配给一个变量,因为我试图将当前的Flash版本设置为一个变量。我知道这是错的,但是这是我试过:将命令输出分配给批处理文件中的变量

组VAR = REG查询HKLM \ SOFTWARE \ Macromedia的\ Flash插件\ CURRENTVERSION>

REG查询hklm \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion >>集变种

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

+0

如果回答以下问题并没有帮助,在谷歌搜索重定向。 [批量相当于猛砸反引号的]的 – 2013-04-25 21:25:19

+0

可能重复(http://stackoverflow.com/questions/2768608/batch-equivalent-of-bash-backticks) – 2014-07-01 16:51:50

+0

其实原来好像是[我如何获得的结果命令在Windows中的变量?](http://stackoverflow.com/q/108439/12892)。 – 2014-07-01 16:54:55

回答

79

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

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

但是,我确定这有它自己的例外和限制。

+0

真棒,感谢您的帮助! – user2283234 2013-04-26 15:51:52

+2

如果它解决了您的问题,请将其标记为已接受。 – 2013-04-27 00:33:54

+2

当我执行上面的命令时,我得到'%%我在这个时候是意外的。不知道为什么。 – 2016-02-26 16:27:26

9

This post具有实现这个

(zvrba) 可以通过先输出重定向到一个文件中做到这一点的方法。例如:

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

不能过程输出直接分配到一个变种,你需要用FOR/F循环来解析输出:

@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:如果更改使用了reg关键需要。

1

好这里使用的对于一些比较复杂的样品/ 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 命令存储在%的输出%批处理cmd不关心作用域,因此%output%也将在主脚本中可用。
  2. @刚开始只是装修而且有抑制回声的命令行。你可以删除它们全部,只是把一些@echo off在第一行真的不喜欢那个。但是,像这样我发现调试更好。 装饰二号是提示 - $ G。它的出现,使命令提示符看起来是这样- >
  3. %使用::的代替REM
  4. 的符号(〜)〜1是从第一个参数
  5. 删除报价
  6. 2 ^> NUL是有抑制/丢弃stderr的错误输出。通常你会通过2> nul。那么^批处理转义字符是避免早日解决重定向(>)。在脚本中稍后会使用一些simulare:echo %1 -^>...因此,有可能通过echo来输出'>',但其他方法不可能。
  7. 即使在比较@if not "%output%"==""看起来像最常见的编程语言 - 它也许不同的是您的预期(如果你不使用MS-批次)。那么在开始时删除'@'。研究输出。将其更改为not %output%=="" -rerun并考虑为何这不起作用。 ;)
相关问题