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)
où 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.
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.
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.
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 "<".
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]