it-swarm.com.de

Wie kann ich den Wert eines Registrierungsschlüssels aus einem Batch-Skript erhalten?

Ich muss einen REG QUERY-Befehl verwenden, um den Wert eines Schlüssels anzuzeigen und das Ergebnis mit diesem Befehl in eine Variable zu setzen:

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

Wenn der Schlüssel nicht vorhanden ist, wird in der Konsole ein Fehler angezeigt. Ich muss diesen Fehler verbergen! Ich habe versucht, einen 2> nul nach dem Befehl zum Stoppen des Befehls stderr zu setzen. Dies funktioniert jedoch, wenn ich nur den Befehl aufrufe:

REG QUERY "KeyName" /v ValueName 2>nul

Wenn ich es so in den Befehl FOR stelle:

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

Der Fehler wird angezeigt ..__ Weiß also jemand, wie er den Fehler ausblenden kann? Oder vielleicht auch einen anderen Befehl, um zu sehen, ob ein Schlüssel existiert oder nicht?

Vielen Dank

PS: Ich verwende Windows XP

55
Fabius

Das funktioniert für mich:

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

usebackq ist erforderlich, da der Befehl für REG QUERY doppelte Anführungszeichen verwendet.

skip=4 ignoriert die gesamte Ausgabe mit Ausnahme der Zeile, die den Namen, den Typ und den Wert enthält, sofern vorhanden.

2^>nul verhindert, dass der Fehlertext angezeigt wird. ^ ist das Escapezeichen, mit dem Sie den > in den Befehl for einfügen können.

Wenn ich das oben angegebene Skript ausführt, erhalte ich folgende Ausgabe:

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

Wenn ich den Wert von VALUE_NAME in BogusValue ändere, erhalte ich Folgendes:

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

Dies funktioniert für mich mit Variablen, die Leerzeichen unter Windows 7 enthalten:

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

Variable A enthält alle Daten vor dem ersten Leerzeichen, B - Restteil von ValueName (einschließlich weiterer Leerzeichen), also appdir = ValueName 

26
Ivan

Basierend auf der tryToBeClever-Lösung (auf die ich zufällig gestoßen bin und mich vor dem Finden durch Versuch und Irrtum behoben habe), empfehle ich auch, die Ergebnisausgabe von reg query durch find zu übergeben, um unerwünschte Zeilen aufgrund der ! REG.EXE VERSION x.y-Inkonsistenz zu filtern. Die find-Filterung und tokens-Optimierung ermöglicht es uns, genau das auszuwählen, was wir wollen (normalerweise der Wert). Es wurden auch Anführungszeichen hinzugefügt, um unerwartete Ergebnisse zu vermeiden, wenn Schlüssel-/Wertnamen Leerzeichen enthalten.

Endergebnis vorgeschlagen, wenn wir nur daran interessiert sind, den Wert abzurufen:

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

Ein möglicher Nachteil bei der Verwendung von find ist, dass der durch reg festgelegte Fehlerlevel jetzt verschleiert wird, so dass man diesen Ansatz nur für Schlüssel verwenden sollte, die bekanntermaßen und/oder nach einer vorherigen Überprüfung vorhanden sind.

Eine winzige zusätzliche Optimierung (add skip=1, um die Verarbeitung der ersten Zeile der Ausgabe zu vermeiden) kann in Fällen durchgeführt werden, in denen der Schlüsselname auch den Wertnamen enthält (wie dies bei HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion und CurrentVersion der Fall ist), jedoch die meiste Flexibilität aufhebt und daher nur verwendet werden sollte in bestimmten Anwendungsfällen.

7

Mir ist klar, dass dies eine alte Frage ist - aber dieser Einzeiler entspricht in etwa dem Ihres ursprünglichen Versuchs mit ein paar Ergänzungen. Es funktioniert mit Pfaden einschließlich Leerzeichen und funktioniert in XP und Windows 7, auch wenn der Schlüssel nicht gefunden wird (und der Fehler ausgeblendet wird). % fn% ist leer, wenn der Schlüssel nicht vorhanden ist. In diesem Beispiel wird der aktuelle Dateiname des Desktop-Hintergrunds abgerufen:

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%

Das funktioniert für mich in Win7, wo der Schlüssel ein Leerzeichen hat und der Wert auch ein Leerzeichen . Wenn Sie das oben in c:\temp als test.bat speichern, öffnen Sie ein Cmd-Fenster und führen Sie es aus.

C:\temp> test

C:\Programme (x86)\acme Software Inc.\APP \ 

5
sheir

Für Windows 7 (Professional, 64-Bit - kann nicht für die anderen sprechen) sehe ich, dass REG nicht mehr ausspuckt 

! REG.EXE VERSION 3.0

wie in XP. Daher muss das oben Genannte modifiziert werden

skip=2

anstelle von 4 - was die Dinge unordentlich macht, wenn Sie möchten, dass Ihr Skript portierbar ist. Obwohl es viel schwerer und komplexer ist, kann eine auf WMIC basierende Lösung besser sein.

4

Aus irgendeinem Grund funktioniert der Code von Patrick Cuff auf meinem System (Windows 7) möglicherweise nicht, wahrscheinlich aufgrund des Kommentars von tryToBeClever. Ein bisschen zu modifizieren hat den Trick:

@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

Dies funktioniert, wenn der Wert ein Leerzeichen enthält:

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

Großartige Lösungen hier.

Mein kleines Salzkorn als Lösung von @Patrick Cuff funktionierte nicht aus der Box; Ich hatte 2 Probleme

  • Ich verwende Windows 7 => geändert zu "Überspringen = 2"
  • Der Wert des Registrierungswerts enthielt ein Leerzeichen Value Value = C:\Program Files\...

Hier ist die Lösung, die ich gefunden habe: 4 Token nehmen und ValueValue auf %% C und %% D setzen. (Danke @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

Um eine bestimmte Antwort auf den Registrierungswert zu erhalten, können Sie die folgende Abfrage verwenden:

REG QUERY "Key_Name"/v "Value_Name"/s

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

here /v: Fragt nach bestimmten Registrierungsschlüsselwerten.

/ s: Abfrage aller Unterschlüssel und Werte rekursiv (wie dir/s)

0
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
)

Wie behandeln Sie ein Leerzeichen in der %% A-Variablen? Dies führt zu C:\Program. Der tatsächliche Pfad lautet C:\Programme\Symantec\pcAnywhere.

0
Tom

Ich habe bei der Verwendung von WMIC auf Windows XP - Computern viele Fehler festgestellt (z. B. aufgrund von beschädigten Dateien auf Computern). Daher sollte WMC für Win XP nicht im Code verwendet werden. Keine Probleme mit WMIC unter Win 7.

0
unseen_rider

Danke, ich muss nur verwenden:

SETLOCAL EnableExtensions

Und stelle ein:

2^>nul

In die REG QUERY, die im FOR-Befehl aufgerufen wird ... Vielen Dank noch einmal! :)

0
Fabius

Sie können den Wert eines Registrierungsschlüssels wie folgt erhalten

@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

diejenigen, die sich fragen, wie man Registrierungsschlüssel hinzufügt, ist hier ein Weg.

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

punkt\am Ende von KEY_NAME

0
jacob justin