2009-05-20 20 views
84

Sotto un ambiente bash faccio di solito:File batch di Windows: come impostare una variabile con il risultato di un comando?

var=$(command -args) 

e io uso $var con il suo valore impostato come il risultato del comando. Lo stesso vale per un più convenzionale

set var=`command -args` 

compatibile in quasi ogni shell unix.

Come definire una variabile in un file di Windows bat come quello? Ho provato

set var=command -args 

ma ho solo il comando "-args" stringa.

risposta

7

L'unico modo che ho visto fare è se si esegue questa operazione:

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

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

Microsoft Windows [Version 6.0.6001] 

Source

54

di fare ciò che Jesse descrive da un file batch è necessario scrivere

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

Ma, ti suggerirò di usare Cygwin sul tuo sistema Windows se sei abituato a unire lo script di tipo.

+15

usare 'for/f" delim = "% a in ('ver') do @set foobar =% a' al prompt dei comandi. usa 'for/f" delims = "%% a in ('ver') do @set foobar = %% a' nei file di script – georg

+0

Un'alternativa leggera è Gnu su Windows (https://github.com/bmatzelle/gow/wiki). Basta aprire un prompt dei comandi ed eseguire 'bash'. Quindi puoi scrivere i comandi di bash. Puoi anche eseguire script bash. – Nathan

+2

Si noti che se il comando include una pipe, è necessario sfuggire con un segno di omissione, ad esempio: per/f "delim =" %% a in ('echo foobar^| sed -es/foo/fu /') do @set foobar = %% a – yoyo

15

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

sqlplus -S schema/[email protected] @query.sql> __query.tmp 
set /p result=<__query.tmp 
del __query.tmp 

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

28

Uno ha bisogno di essere un po 'attenti, dal momento che il comando batch di Windows:

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

non ha la stessa semantica della shell dichiarazione Unix:

theValue=`command` 

Si consideri il caso in cui il comando non riesce , causando un errore.

Nella versione shell Unix, il compito di "theValue" si verifica ancora, qualsiasi valore precedente da sostituire con un valore vuoto.

Nella versione batch di Windows, è il "per" comando che gestisce l'errore, e la clausola "fare" non è mai raggiunto - in modo che qualsiasi valore precedente di "theValue" saranno mantenuti.

Per ottenere più semantica Unix-like in script batch di Windows, è necessario assicurarsi che l'assegnazione si svolge:

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

Non riuscendo a cancellare il valore della variabile durante la conversione di uno script UNIX a Windows in batch può essere una causa di errori sottili.

+2

Grazie per aver spiegato la sottile differenza tra Windows e * nix. –

+1

Ricordati inoltre di evitare qualsiasi carattere speciale in 'command'; ad es .: 'per/f" delim = "%% a in ('comando1^| comando2') imposta VAR = %% a'. –

Problemi correlati