104 votes

Fichiers de commandes Windows: Comment définir une variable avec le résultat d'une commande?

Dans un environnement bash, je fais habituellement:

 var=$(command -args)
 

et j'utilise $var avec sa valeur définie comme résultat de la commande. La même chose va à un plus conventionnel

 set var=`command -args`
 

compatible dans presque tous les shell unix.

Comment définir une variable dans un fichier Windows bat comme ça? J'ai essayé

 set var=command -args
 

mais je ne reçois que la chaîne "command -args".

66voto

nik Points 8025

Pour faire ce que Jesse décrit à partir d’un fichier de commandes, vous devrez écrire

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

Mais, je suggérerai d’utiliser Cygwin sur votre système Windows si vous êtes habitué aux scripts de type Unix.

37voto

Jonathan Headland Points 111

Il faut être un peu prudent, depuis les Fenêtres de commande de traitement par lots:

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

ne pas avoir la même sémantique que le shell Unix déclaration:

theValue=`command`

Considérons le cas où la commande échoue, ce qui provoque une erreur.

Dans le shell Unix version, l'assignation à "theValue" se produit encore, toute valeur précédente d'être remplacé par une valeur vide.

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

Pour obtenir plus d'Unix-like de la sémantique dans Windows script batch, vous devez vous assurer que la cession a lieu:

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

À défaut pour effacer la valeur de la variable lors de la conversion d'un script Unix à Windows de lot peut être une cause de subtiles erreurs.

21voto

lotsoffreetime Points 790

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 "<".

16voto

Jesse Dearing Points 1602

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]
 

La source

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X