web-dev-qa-db-fra.com

Définir la valeur d'une variable avec le résultat d'une commande dans un fichier de commandes Windows

Lorsque je travaille dans un environnement Bash, pour définir la valeur d'une variable à la suite d'une commande, je fais généralement:

var=$(command -args)

var est la variable définie par la commande command -args. Je peux alors accéder à cette variable en tant que $var.

Une façon plus conventionnelle de le faire compatible avec presque tous les shell Unix est la suivante:

set var=`command -args`

Cela dit, comment définir la valeur d'une variable avec le résultat d'une commande dans un fichier de commandes Windows? J'ai essayé:

set var=command -args

Mais je trouve que var est réglé sur command -args plutôt que la sortie de la commande.

96
Francis

Pour faire ce que décrit par Jesse , à partir d'un fichier de commandes Windows, vous devez écrire:

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

Mais, je suggère plutôt d'utiliser Cygwin sur votre système Windows si vous êtes habitué aux scripts de type Unix.

60
nik

Il faut être prudent, car la commande batch de Windows:

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

n'a pas la même sémantique que l'instruction Unix Shell:

theValue=`command`

Prenons le cas où la commande échoue et provoque une erreur.

Dans la version Unix Shell, l'affectation à "theValue" a toujours lieu, toute valeur précédente étant remplacée par une valeur vide.

Dans la version batch de Windows, c'est la commande "pour" qui gère l'erreur et la clause "do" n'est jamais atteinte - ainsi, toute valeur précédente de "theValue" sera conservée.

Pour obtenir davantage de sémantique Unix dans le script batch de Windows, vous devez vous assurer que l'affectation a bien lieu:

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

Ne pas effacer la valeur de la variable lors de la conversion d'un script Unix en batch Windows peut être une cause d'erreurs subtiles.

34
Jonathan Headland

Voici comment procéder lorsque j'ai besoin des résultats d'une requête de base de données dans mon fichier de traitement par lots:

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

La clé est dans la ligne 2: "set/p" définit la valeur de "result" sur la valeur de la première ligne (uniquement) dans "__query.tmp" via l'opérateur de redirection "<".

17
lotsoffreetime

La seule façon dont je l'ai vu faire est si vous faites ceci:

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

ver est la commande de version pour Windows et produit sur mon système:

Microsoft Windows [Version 6.0.6001]

Source

14
Jesse Dearing