48

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

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

また

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

ええ、ご覧のとおり、私は少し迷っています。どんな助けでも大歓迎です!

4

5 に答える 5

4

プロセス出力を変数に直接割り当てることはできません。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: 必要に応じて使用するレジストリ キーを変更します。

于 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%に格納されます。Batch cmd はスコープを気にしないため、メイン スクリプトでも %output% を使用できます。
  2. @は単なる装飾であり、コマンドラインのエコーを抑制するためのものです。それらをすべて削除して、最初の行に@echo をオフにするのは本当に嫌いです。ただし、このように、デバッグははるかに優れていると思います。装飾番号 2 は、プロンプト -$Gです。コマンドプロンプトを次のようにするためにあります->
  3. remの代わりに::を使用します
  4. %~1のチルダ (~) は、最初の引数から引用符を削除することです
  5. 2^>nulは、 stderrエラー出力を抑制/破棄するためにあります。通常は2>nulで行います。^バッチ エスケープ文字があると、リダイレクタ (>) の早期解決を回避できますスクリプトの少し後で、simulare の使用がいくつかあります。つまり、echo %1 -^>...^ を使用すると、他では不可能だった出力を echo 経由で '>' にすることができます。
  6. 比較@if not "%output%"==""がほとんどの一般的なプログラミング言語のように見えても、予想とは異なる場合があります (MS バッチに慣れていない場合)。先頭の「@」を削除してください。出力を調べます。-rerun に変更しnot %output%==""、これが機能しない理由を検討してください。;)
于 2017-03-11T17:05:42.217 に答える