web-dev-qa-db-ja.com

バッチスクリプト内からレジストリキーの値を取得するにはどうすればよいですか?

キーの値を表示し、このコマンドで変数に結果を設定するには、REG QUERYコマンドを使用する必要があります。

FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B

しかし、キーが存在しない場合、コンソールにエラーが表示されます。このエラーを非表示にする必要があります!私はコマンドの後に2> nulを入れてstderrを停止しようとしましたが、これはコマンドを呼び出すだけの場合に機能します:

REG QUERY "KeyName" /v ValueName 2>nul

このようにFORコマンドに入れた場合:

FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B 2>nul

エラーが表示されます。だから誰もがエラーを隠す方法を知っていますか?または、別のコマンドでもキーが存在するかどうかを確認できますか?

ありがとう

PS:Windows XPを使用しています

57
Fabius

これは私のために働く:

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor

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

if defined ValueName (
    @echo Value Name = %ValueName%
    @echo Value Type = %ValueType%
    @echo Value Value = %ValueValue%
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

REG QUERYへのコマンドは二重引用符を使用するため、usebackqが必要です。

skip=4は、値の名前、タイプ、値が存在する場合、その行を除くすべての出力を無視します。

2^>nulは、エラーテキストが表示されないようにします。 ^は、forコマンドに>を挿入できるエスケープ文字です。

上記のスクリプトを指定されたとおりに実行すると、次の出力が得られます。

Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0

VALUE_NAMEの値をBogusValueに変更すると、次のようになります。

"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
58
Patrick Cuff

これは、Windows 7でスペースを含む変数で機能します。

FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\Software\SomeAPP" /v ValueName`) DO (
    set appdir=%%A %%B
    )
ECHO %appdir%

変数Aには、最初のスペースの前のすべてのデータが含まれます、B-ValueNameの残りの部分(さらにスペースを含む)なので、appdir = ValueName

30
Ivan

TryingToBeCleverソリューション(偶然につまずき、それを見つける前に試行錯誤で修正した)に基づいて、reg queryの結果出力をfindに渡すことをお勧めします。 ! REG.EXE VERSION x.y不整合。 findフィルタリングとtokensの調整により、必要なもの(通常は値)を正確に選択することもできます。また、スペースを含むキー/値の名前で予期しない結果を避けるために引用符を追加しました。

値の取得のみに関心がある場合に提案される最終結果:

@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKCU\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor
for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
  echo %%A
)

findを使用する場合の潜在的な注意点は、エラーが発生したときにregによって設定されたエラーレベルが難読化されるため、存在することがわかっているキーおよび/または以前の検証後にのみこのアプローチを使用することです。

キー名に値名も含まれる場合(skip=1およびCurrentVersionの場合)、ごくわずかな追加の最適化(出力の最初の行の処理を避けるためにHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersionを追加)を実行できますが、ほとんどの柔軟性が失われるため、特定のユースケースでのみ使用する必要があります。

7

これは古い質問だと思いますが、このワンライナーは、いくつかの追加を加えた元の試みとほとんど同じです。スペースを含むパスで機能し、XPとWindows 7の両方で機能します(キーが見つからない場合でもエラーを隠します)。キーが存在しない場合、%fn%は空になります。この例では、現在のデスクトップ背景ファイル名を取得します。

for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do @set fn=%%b
5
ChevyNo1
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKLM\SOFTWARE\Wow6432Node\Acme Software Inc\Common
set VALUE_NAME=InstallDir

FOR /F "tokens=2*" %%A IN ('REG.exe query "%KEY_NAME%" /v "%VALUE_NAME%"') DO (set pInstallDir=%%B)
echo %pInstallDir%

これは、キーにスペースがあり、値にもスペースがあるWin7で機能します。したがって、上記をc。\ tempにtest.batとして保存し、cmdウィンドウを開いて実行します。

C:\ temp> test

C:\ Program Files(x86)\ acme Software Inc\APP \

5
sheir

Windows 7(Professional、64ビット-他の人のために話すことはできません)REGが吐き出さなくなったことがわかります

! REG.EXE VERSION 3.0

xPと同じです。したがって、上記を使用するには変更する必要があります

skip=2

4の代わりに-スクリプトを移植可能にしたい場合は面倒です。それははるかに重くて複雑ですが、 WMIC ベースのソリューションの方が良いかもしれません。

4

何らかの理由で、おそらくTotryToBeCleverのコメントが原因で、Patrick Cuffのコードが私のシステム(Windows 7)で機能しません。それを少し変更すると、トリックが行われました:

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_CURRENT_USER\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor

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

if defined ValueName (
    @echo Value Name = %ValueName%
    @echo Value Type = %ValueType%
    @echo Value Value = %ValueValue%
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)
4
niels

これは、値にスペースが含まれている場合に機能します。

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

if defined ValueName (
    echo Value Name = %ValueName%
    echo Value Type = %ValueType%
    echo Value Value = %ValueValue%
) else (
    @echo "%KEY_NAME%"\"%VALUE_NAME%" not found.
)
4
Andrew S

ここで優れたレベルのソリューション。

解決策としての私の小さな粒@Patrick Cuffはそのままでは機能しませんでした。 2つの問題がありました

  • Windows 7を使用します=> "skip = 2"に変更
  • レジストリ値の値にスペースがありましたValue Value = C:\Program Files\...

私が見つけた解決策は次のとおりです。4つのトークンを取得し、ValueValueを%% Cと%% Dに設定します。 (@Ivanに感謝!)

setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor

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

if defined ValueName (
    @echo Value Name = %ValueName%
    @echo Value Type = %ValueType%
    @echo Value Value = %ValueValue%
) else (
    @echo "%KEY_NAME:"=%\%VALUE_NAME%" not found.
)
4

レジストリ値に対する特定の回答を取得するには、次のクエリを使用できます。

登録クエリ「キー名」/ v「値名」/ s

例:REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"/v "EnableExtensions"/s

here/v:特定のレジストリキー値を照会します。

/ s:すべてのサブキーと値を再帰的に照会します(dir/sなど)

1
Ishita Kapur
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\awhost32.exe
set VALUE_NAME=Path
for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
  echo %%A
)

%% A変数のスペースはどのように処理しますか?これにより、C:\ Programが作成されます。実際のパスはC:\ Program Files\Symantec\pcAnywhereです。

0
Tom

Windows XPコンピューターでWMICを使用しているときに多くのエラーに遭遇しました(たとえば、マシン上のファイルの破損が原因)。したがって、WMIC for Win XPをコードで使用しないことが最適です。ただし、Win 7上のWMICに問題はありません。

0
unseen_rider

おかげで、私は使用する必要があります:

SETLOCAL EnableExtensions

そして:

2^>nul

FORコマンドで呼び出されたREG QUERYへ。どうもありがとう! :)

0
Fabius

次のようにレジストリキーを取得できます

@echo OFF
setlocal ENABLEEXTENSIONS
set REG_NAME="HKEY_CURRENT_USER\Software\Test"
set KEY_NAME=TestVal

FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %REG_NAME% /v %KEY_NAME% 2^>nul`) DO (
    @echo %%A : %%C
)
pause

regキーを追加する方法を知りたい人は、ここに方法があります。

REGEDIT4

; @ECHO OFF
; CLS
; REGEDIT.EXE /S "%~f0"
; EXIT

[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"
0
Sameera R.
echo Off
setlocal ENABLEEXTENSIONS

set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup"
set VALUE_NAME=release 

REG QUERY %KEY_NAME% /S /v %VALUE_NAME%
endlocal

kEY_NAMEの末尾にドットを置く\

0
jacob justin