48

我正在尝试将命令的输出分配给一个变量——例如,我正在尝试将当前的闪存版本设置为一个变量。我知道这是错误的,但这是我尝试过的:

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

或者

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

是的,正如你所看到的,我有点迷路了。任何和所有的帮助表示赞赏!

4

5 回答 5

98

已经设计了一种方法,但是这样您就不需要临时文件。

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

但是,我确信这有其自身的例外和限制。

于 2013-04-24T23:23:10.343 回答
13

这篇文章有一种方法可以实现这一点

from (zvrba) 你可以通过首先将输出重定向到一个文件来做到这一点。例如:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
于 2013-04-24T23:03:33.503 回答
4

您不能将进程输出直接分配给 var,您需要使用 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 密钥。

于 2013-04-24T23:40:39.087 回答
2

好的,这里有一些更复杂的示例供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. 通过call :EXEC命令执行的命令的输出存储在%output%中。批处理 cmd 不关心范围,因此 %output% 也将在主脚本中可用。
  2. @开头只是装饰,用于抑制回显命令行。您可以将它们全部删除,然后在第一行关闭一些@echo,这真的很不喜欢。然而,像这样我发现调试更好。第二个装饰是提示符 -$G。它可以使命令提示符看起来像这样->
  3. 我使用::而不是rem
  4. %~1中的波浪号(~)是从第一个参数中删除引号
  5. 2^>nul用于抑制/丢弃stderr错误输出。通常你会通过2>nul来做。那么^批处理转义字符避免了早期解析重定向器(>)。稍后在脚本中有一些类似的使用:echo %1 -^>...所以 ^ 使得通过 echo 输出 '>' 成为可能,这是不可能的。
  6. 即使比较@if not "%output%"==""看起来像大多数常见的编程语言 - 它可能与您预期的不同(如果您不习惯 MS-batch)。好吧,删除开头的“@”。研究输出。将其更改为not %output%==""-rerun 并考虑为什么这不起作用。;)
于 2017-03-11T17:05:42.217 回答
0

这对我来说是工作

@FOR /f "delims=" %i in ('reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion') DO set var=%i
echo %var%
于 2019-01-26T02:20:36.503 回答