web-dev-qa-db-ja.com

コマンド出力をバッチファイルの変数に割り当てる

コマンドの出力を変数に割り当てようとしています。たとえば、現在のフラッシュバージョンを変数に設定しようとしています。私はこれが間違っていることを知っていますが、これは私が試したものです:

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

または

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

ええ、あなたが見ることができるように、私は少し迷います。すべての助けをいただければ幸いです!

38
user2283234

メソッドはすでに考案されていますが、この方法では一時ファイルは必要ありません。

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

ただし、これには独自の例外と制限があると確信しています。

81
BDM

この投稿 にはこれを実現する方法があります

from(zvrba)最初に出力をファイルにリダイレクトすることで実行できます。例えば:

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

プロセス出力を変数に直接割り当てることはできません。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キーを変更します。

2
ElektroStudios

さて、ここで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:EXECcommandを介して実行されたコマンドからの出力は%output%に保存されます。 バッチcmdはスコープを無視するため、%output%はメインスクリプトでも使用できます。
  2. @始まりは単なる装飾であり、コマンドラインのエコーを抑制するためにあります。それらをすべて削除して、いくつかの@ echo offを最初の行に置くだけでも、本当に嫌いです。しかし、このように私はデバッグがはるかに素晴らしいと感じています。装飾番号2はプロンプト-$ Gです。コマンドプロンプトを次のようにするためにあります->
  3. remの代わりに::を使用します
  4. %〜1のチルダ(〜)は、最初の引数から引用符を削除することです
  5. 2 ^> nulは抑制/破棄するためにありますstderrエラー出力。通常は2> nulで行います。 ^バッチエスケープ文字は、リダイレクタ(>)を早期に解決することを避けます。スクリプトの少し後で使用するいくつかのシミュレーションがあります:echo %1 -^>...ですので、他の方法では不可能だったエコー経由での出力を「>」できます。
  6. たとえ@if not "%output%"==""は、ほとんどの一般的なプログラミング言語のように見えます-MSバッチに慣れていない場合、予想とは異なる可能性があります。最初に「@」を削除します。出力を調べます。変更してnot %output%==""-再実行して、なぜこれが機能しないのかを検討してください。 ;)
1
Nadu

これは私のための仕事です

@FOR /f "delims=" %i in ('reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion') DO set var=%i
echo %var%
0
Chetabahana