69

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 を使用しています。

4

18 に答える 18

68

これは私のために働きます:

@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.
)

usebackqREG QUERY二重引用符を使用するコマンドなので、が必要です。

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.
于 2009-01-15T01:23:00.837 に答える
31

これは、Windows7でスペースを含む変数を使用して機能します。

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

于 2012-12-02T22:29:33.280 に答える
9

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

値のフェッチのみに関心がある場合に提案される最終結果:

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

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

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

于 2011-12-22T14:33:02.083 に答える
6
@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>テスト

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

于 2012-10-04T14:52:14.080 に答える
5

おそらく、tryingToBeClever のコメントが原因で、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.
)
于 2011-10-31T23:23:51.053 に答える
4

Windows 7 (Professional、64 ビット - 他の人について話すことはできません) の場合、REG が吐き出されなくなりました。

! REG.EXE VERSION 3.0

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

skip=2

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

于 2011-02-17T13:19:05.193 に答える
4

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

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.
)
于 2012-11-28T17:21:24.860 に答える
0

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

SETLOCAL EnableExtensions

そして置く:

2^>nul

FORコマンドで呼び出されたREGQUERYに。どうもありがとうございました!:)

于 2009-01-15T01:36:14.960 に答える
0
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 の末尾にドット \ を挿入

于 2013-06-27T11:41:00.200 に答える
0

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

@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"
于 2015-12-17T06:29:02.733 に答える
0

regedit を使用する場合:

@echo off
setlocal
::if the scrit is not ran as administrator
::  and the key does not require admin permissions
set __COMPAT_LAYER=RunAsInvoker

set "key=%~1"
set "value=%~2"

regedit /e "#.reg" "%key%"


for /f "tokens=1,* delims==" %%a in ('find  """%value%""=" "#.reg"') do if "%%~b" neq "" echo %%~b
del /q #.reg

endlocal

例:

call regreader.bat "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1033\" Version

出力:

3.0.30729.4926

于 2020-11-09T04:29:45.937 に答える
0

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

于 2015-01-19T15:13:00.180 に答える
0
@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 です。

于 2012-05-02T14:09:30.043 に答える