7

レジストリ値を読み取るバッチ ファイルがあります。

しかし、私が読んでいるエントリにはスペースが含まれており、変数を設定するときに最初のスペース文字の前にあるものだけをキャプチャしているようです。

set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry"
set VALUE_NAME=Home

FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A
    set ValueType=%%B
    set Home=%%C
)

if defined ValueName (
    @echo Home = %Home%
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

ホーム レジストリ エントリには、実際には "C:\Program Files (x86)\Dir1\Dir2" という文字列が含まれており、バッチ ファイルはこれだけをキャプチャします: C:\Program

これを修正する方法を知っている人はいますか?

ありがとう

4

3 に答える 3

9

この問題は、文字列にスペースが含まれており、文字列の 2 番目の部分 (より多くのスペースがある場合はより多くの部分) が別のトークン (4、5 など) として扱われるために発生します。これを修正するには、行の残りを%%C にアスタリスクを付けると、次のようになります。

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A
    set ValueType=%%B
    set Home=%%C
)

アスタリスク ( *) は、行の残りを次の変数に渡すことを意味します (すべてのスペースを含む)。

于 2013-04-29T15:18:34.253 に答える
4
@ECHO OFF
SETLOCAL
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry"
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Space Sciences Laboratory, U.C. Berkeley\BOINC Setup"
set VALUE_NAME=migrationdir

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (
 `REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set "ValueName=%%A"
    set "ValueType=%%B"
    set Home="%%C"
)

IF DEFINED home SET home=%home:"=%
if defined Home echo Home = %Home%
if NOT defined Home echo %KEY_NAME%\%VALUE_NAME% not found.

鍵を持っていないので、持っ...\My Entryている鍵で代用しました。

最初の項目 - 必要なデータにはスペースが含まれており、スペースはデフォルトの区切り文字であるため1,2*、トークンとして使用する必要があります - 行の最初、2 番目、残りの部分。

次の小さな問題は、データ項目 ALSO が)の閉じ括弧として解釈されるFOR/fため、エラーが発生することです-あなたの場合、\Dir1\Dir2ここでは期待されていません

これを克服する方法は、引用符を付けてから、割り当てられた値を削除することですhome

しかし、ここでも、閉じ括弧homeは IF ステートメントの TRUE 部分を終了する役割を果たします。

HOME に割り当てられた値の有無をオンに切り替えると、これが克服されます。Valuename明らかに、ここには隠れたフェイル トゥ フェイルがありますが、同じことが言えます。

要求されたレジストリ エントリが見つからない場合、SETFOR/fは実行されません。したがって、3 つの変数の値は、 が実行される前の値から変更されませんFOR/f。したがって、home(またはvaluenameその値を使用することを選択した場合) の値が のsomeexistingvalue前にあるfor/f場合、予期しない結果が表示される可能性があります。

(ところで -句for/fの括弧のいずれかまたは両方を壊すことは正当で見栄えが良いです)IN

于 2013-04-29T15:21:20.520 に答える