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

99

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)

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

Une manière plus conventionnelle de faire ceci qui est compatible avec presque tous les shell Unix est:

set var=`command -args`

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

set var=command -args

Mais je trouve que varc'est réglé sur command -argsplutôt que sur la sortie de la commande.

Francis
la source

Réponses:

63

Pour faire ce que décrit Jesse , à partir d'un fichier batch Windows, vous devrez écrire:

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

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

nik
la source
19
utiliser for /f "delims=" %a in ('ver') do @set foobar=%asur l'invite de commande. utiliser for /f "delims=" %%a in ('ver') do @set foobar=%%adans les fichiers de script
georg
Une alternative légère est Gnu sur Windows ( github.com/bmatzelle/gow/wiki ). Ouvrez simplement une invite de commande et exécutez bash. Ensuite, vous pouvez écrire des commandes bash. Vous pouvez également exécuter des scripts bash.
Nathan
4
Notez que si votre commande inclut un tube, vous devez l'échapper avec un signe d'insertion, par exemple: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ set foobar = %% a
yoyo
35

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

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

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

theValue=`command`

Considérez le cas où la commande échoue, provoquant une erreur.

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

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

Pour obtenir plus de sémantique de type Unix dans le script batch Windows, vous devez vous assurer que l'affectation a 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.

Jonathan Headland
la source
2
Merci d'avoir expliqué la différence subtile entre Windows et * nix.
Jeroen Wiert Pluimers
3
N'oubliez pas non plus d'échapper aux caractères spéciaux dans command; par exemple: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart
@Bill_Stewart vous venez de sauver ma journée, pendant un moment, j'ai pensé qu'il était beaucoup plus difficile d'assigner la sortie des commandes
piped
19

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

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

La clé se trouve à 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 "<".

beaucoup de temps libre
la source
14

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

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

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

Microsoft Windows [Version 6.0.6001]

La source

Jesse Dearing
la source
0
Set "dateTime="
For /F %%A In ('powershell get-date -format "{yyyyMMdd_HHmm}"') Do Set "dateTime=%%A"
echo %dateTime%
pause

entrez la description de l'image ici Documents officiels Microsoft pour la forcommande

alchi baucha
la source