Assegna l’output del comando alla variabile nel file batch

Sto cercando di assegnare l’output di un comando a una variabile – come in, sto cercando di impostare la versione flash corrente su una variabile. So che questo è sbagliato, ma questo è quello che ho provato:

imposta var = reg query hklm \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion>

o

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

Sì, come puoi vedere sono un po ‘perso. Qualsiasi aiuto è apprezzato!

Un metodo è già stato ideato, tuttavia in questo modo non è necessario un file temporaneo.

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

Tuttavia, sono sicuro che questo ha le sue eccezioni e limitazioni.

Questo post ha un metodo per raggiungere questo objective

da (zvrba) Puoi farlo reindirizzando prima l’output in un file. Per esempio:

 echo zz > bla.txt set /p VV= 

Non è ansible assegnare un output di processo direttamente in una var, è necessario analizzare l’output con un ciclo For / F:

 @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: cambia la chiave del registro usata se necessario.

Va bene qui un esempio più complesso per l’uso di 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 

L’ho inserito nella sottofunzione: EXEC quindi tutti i suoi brutti dettagli sull’implementazione non leccano la sceneggiatura principale. Quindi ha un po ‘di tutorial in serie. Note sul codice:

  1. l’output dal comando eseguito tramite chiamata: il comando EXEC è memorizzato in % output% . Il cmd di Batch non interessa gli ambiti, quindi% output% sarà disponibile anche nello script principale.
  2. @ l’inizio è solo decorazione e lì per sopprimere echeggiare la riga di comando. Puoi eliminarli tutti e basta mettere un po ‘di @echo alla prima linea e questo non piace. Comunque in questo modo trovo il debug molto più bello. La decorazione numero due è pronta – $ G. È lì per rendere il prompt dei comandi simile a questo ->
  3. Io uso :: invece di rem
  4. la tilde (~) in % ~ 1 serve per rimuovere le virgolette dal primo argomento
  5. 2 ^> nul è lì per sopprimere / eliminare l’output di errore di stderr . Normalmente lo faresti tramite 2> nul . Bene il ^ il batch escape char è lì evita di risolvere in anticipo il redirector (>). C’è un po ‘di uso simile in un secondo momento nella sceneggiatura: echo %1 -^>... così là ^ rende ansible l’output a’> ‘tramite echo cos’altro non sarebbe stato ansible.
  6. anche se il confronto con @if not "%output%"=="" è simile ai più comuni linguaggi di programmazione, forse è diverso da quello che ti aspettavi (se non sei abituato a MS-batch). Rimuovere bene la ‘@’ all’inizio. Studia l’output. Cambialo in not %output%=="" -rerun e considera perché questo non funziona. 😉