キーの値を表示し、このコマンドで変数に結果を設定するには、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を使用しています
これは私のために働く:
@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.
これは、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
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
を追加)を実行できますが、ほとんどの柔軟性が失われるため、特定のユースケースでのみ使用する必要があります。
これは古い質問だと思いますが、このワンライナーは、いくつかの追加を加えた元の試みとほとんど同じです。スペースを含むパスで機能し、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
@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 \
Windows 7(Professional、64ビット-他の人のために話すことはできません)REGが吐き出さなくなったことがわかります
! REG.EXE VERSION 3.0
xPと同じです。したがって、上記を使用するには変更する必要があります
skip=2
4の代わりに-スクリプトを移植可能にしたい場合は面倒です。それははるかに重くて複雑ですが、 WMIC ベースのソリューションの方が良いかもしれません。
何らかの理由で、おそらく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.
)
これは、値にスペースが含まれている場合に機能します。
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.
)
ここで優れたレベルのソリューション。
解決策としての私の小さな粒@Patrick Cuffはそのままでは機能しませんでした。 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.
)
レジストリ値に対する特定の回答を取得するには、次のクエリを使用できます。
登録クエリ「キー名」/ v「値名」/ s
例:REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"/v "EnableExtensions"/s
here/v:特定のレジストリキー値を照会します。
/ s:すべてのサブキーと値を再帰的に照会します(dir/sなど)
@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です。
Windows XPコンピューターでWMICを使用しているときに多くのエラーに遭遇しました(たとえば、マシン上のファイルの破損が原因)。したがって、WMIC for Win XPをコードで使用しないことが最適です。ただし、Win 7上のWMICに問題はありません。
おかげで、私は使用する必要があります:
SETLOCAL EnableExtensions
そして:
2^>nul
FORコマンドで呼び出されたREG QUERYへ。どうもありがとう! :)
次のようにレジストリキーの値を取得できます
@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"
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の末尾にドットを置く\