it-swarm.com.de

Ordnen Sie die Befehlsausgabe der Variable in der Stapeldatei zu

Ich versuche, die Ausgabe eines Befehls einer Variablen zuzuweisen - wie in, versuche ich, die aktuelle Flash-Version auf eine Variable zu setzen. Ich weiß, dass das falsch ist, aber ich habe es versucht:

set var = reg Abfrage hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion>

oder

reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion >> set var

Ja, wie du sehen kannst, bin ich ein bisschen verloren. Jede Hilfe wird geschätzt!

38
user2283234

Es wurde bereits eine Methode entwickelt, auf diese Weise benötigen Sie jedoch keine temporäre Datei.

for /f "delims=" %%i in ('command') do set output=%%i

Ich bin jedoch sicher, dass dies seine eigenen Ausnahmen und Einschränkungen hat.

80
Prof Pickle

Dieser Beitrag hat eine Methode, um dies zu erreichen

von (zvrba) Sie können dies tun, indem Sie die Ausgabe zuerst in eine Datei umleiten. Zum Beispiel: 

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
9
Ian Kenney

Sie können eine Prozessausgabe nicht direkt einem var zuordnen, Sie müssen die Ausgabe mit einer For/F-Schleife analysieren:

@Echo OFF

FOR /F "Tokens=2,*" %%A IN (
    'Reg Query "HKEY_CURRENT_USER\Software\Macromedia\FlashPlayer" /v "CurrentVersion"'
) DO (
    REM Set "Version=%%B"
    Echo Version: %%B
)

Pause&Exit

http://ss64.com/nt/for_f.html

PS: Ändern Sie bei Bedarf den verwendeten Registrierungsschlüssel.

2
ElektroStudios

Okay, hier ein etwas komplexeres Beispiel für die Verwendung von For/F

:: Main
@Prompt -$G
    call :REGQUERY  "Software\Classes\CLSID\{3E6AE265-3382-A429-56D1-BB2B4D1D}"

@goto :EOF

:REGQUERY
:: Checks HKEY_LOCAL_MACHINE\ and HKEY_CURRENT_USER\ 
:: for the key and lists its content

    @call :EXEC "REG QUERY  HKCU\%~1"
    @call :EXEC "REG QUERY "HKLM\%~1""

@goto :EOF    

:EXEC
    @set output=

    @for /F "delims=" %%i in ('%~1 2^>nul') do @(
        set output=%%i
    )

    @if not "%output%"=="" (
        echo %1 -^> %output%
    )

@goto :EOF

Ich habe es in die Unterfunktion: EXEC gepackt, so dass all seine unangenehmen Implementierungsdetails nicht das Hauptskript zerstören. Es hat also ein bisschen Batch-Tutorial bekommen.

  1. die Ausgabe des über call ausgeführten Befehls: EXEC commandwird in% output% gespeichert. Batch cmd kümmert sich nicht um Bereiche, daher steht% output% auch im Hauptskript zur Verfügung.
  2. der @ Anfang ist nur Dekoration und dient dazu, das Echo der Befehlszeile zu unterdrücken. Sie können sie alle löschen und einfach ein paar @echo ausschalten in der ersten Zeile ist das wirklich nicht. Aber so finde ich das Debuggen viel schöner. Dekoration Nummer zwei ist Prompt - $ G . Es ist da, um den Befehl Prompt so aussehen zu lassen ->  
  3. Ich benutze :: anstelle von rem
  4. die Tilde (~) in% ~ 1 soll Anführungszeichen aus dem ersten Argument entfernen
  5. 2 ^> nul gibt die Fehlerausgabe stderr aus. Normalerweise würden Sie dies über 2> nul tun. Nun, das ^ das Batch-Escape-Zeichen ist da, um das Redirector (>) frühzeitig aufzulösen. Etwas später wird etwas im Skript verwendet: echo %1 -^>... so ermöglicht es die Ausgabe ein '>' per Echo, was sonst nicht möglich gewesen wäre.
  6. auch wenn der Vergleich bei @if not "%output%"=="" wie in den meisten gängigen Programmiersprachen aussieht - ist es vielleicht anders, als Sie es erwartet haben (wenn Sie nicht an MS-batch gewöhnt sind). Entfernen Sie das '@' am Anfang. Studieren Sie die Ausgabe. Ändern Sie es in not %output%==""-rerun und überlegen Sie, warum dies nicht funktioniert. ;)
1
Nadu

Das ist Arbeit für mich

@FOR /f "delims=" %i in ('reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion') DO set var=%i
echo %var%
0
Chetabahana