Imposta il valore di una variabile con il risultato di un comando in un file batch di Windows


99

Quando lavoro in un ambiente Bash , per impostare il valore di una variabile come risultato di un comando, di solito faccio:

var=$(command -args)

dove varè la variabile impostata dal comando command -args. Posso quindi accedere a quella variabile come $var.

Un modo più convenzionale per farlo, compatibile con quasi tutte le shell Unix, è:

set var=`command -args`

Detto questo, come posso impostare il valore di una variabile con il risultato di un comando in un file batch di Windows ? Ho provato:

set var=command -args

Ma trovo che varsia impostato su command -argspiuttosto che sull'output del comando.

Risposte:


63

Per fare ciò che descrive Jesse , da un file batch di Windows dovrai scrivere:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Ma, invece, suggerisco di usare Cygwin sul tuo sistema Windows se sei abituato allo scripting di tipo Unix.


19
utilizzare for /f "delims=" %a in ('ver') do @set foobar=%asul prompt dei comandi. utilizzare for /f "delims=" %%a in ('ver') do @set foobar=%%anei file di script
georg

Un'alternativa leggera è Gnu su Windows ( github.com/bmatzelle/gow/wiki ). Apri semplicemente un prompt dei comandi ed esegui bash. Quindi puoi scrivere comandi bash. Puoi anche eseguire script bash.
Nathan

4
Nota che se il tuo comando include una pipe, devi evitarla con un accento circonflesso, ad esempio: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ imposta foobar = %% a
yoyo

35

Bisogna stare un po 'attenti, poiché il comando batch di Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

non ha la stessa semantica dell'istruzione di shell Unix:

theValue=`command`

Considera il caso in cui il comando fallisce, causando un errore.

Nella versione della shell Unix, l'assegnazione a "theValue" si verifica ancora, qualsiasi valore precedente viene sostituito con un valore vuoto.

Nella versione batch di Windows, è il comando "for" che gestisce l'errore e la clausola "do" non viene mai raggiunta, quindi qualsiasi valore precedente di "theValue" verrà mantenuto.

Per ottenere più semantica simile a Unix nello script batch di Windows, è necessario assicurarsi che l'assegnazione avvenga:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

La mancata cancellazione del valore della variabile durante la conversione di uno script Unix in batch di Windows può essere causa di piccoli errori.


2
Grazie per aver spiegato la sottile differenza tra Windows e * nix.
Jeroen Wiert Pluimers

3
Ricorda inoltre di eseguire l'escape di eventuali caratteri speciali in command; ad esempio: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart

@ Bill_Stewart mi hai appena salvato la giornata, per un momento ho pensato che fosse molto più difficile assegnare l'output dei comandi in pipe a una variabile
MrBrody

19

Ecco come lo faccio quando ho bisogno dei risultati di una query di database nel mio file batch:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

La chiave è nella riga 2: "set / p" imposta il valore di "result" sul valore della prima riga (solo) in "__query.tmp" tramite l'operatore di reindirizzamento "<".


14

L'unico modo in cui l'ho visto fare è se fai questo:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver è il comando di versione per Windows e sul mio sistema produce:

Microsoft Windows [Version 6.0.6001]

fonte


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.