2013-04-24 102 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並考慮爲何這不起作用。 ;)
相關問題