Je cherche à obtenir le résultat d'une commande en tant que variable dans un script batch Windows (voir comment obtenir le résultat d'une commande en bash pour l'équivalent du script bash). Une solution qui fonctionnera dans un fichier .bat est préférable, mais d'autres solutions de script Windows courantes sont également les bienvenues.
windows
scripting
batch-file
John Meagher
la source
la source
Réponses:
Si vous devez capturer toute la sortie de la commande, vous pouvez utiliser un lot comme celui-ci:
Toutes les lignes de sortie sont stockées dans VAR séparées par "!".
@John: y a-t-il une utilité pratique pour cela? Je pense que vous devriez regarder PowerShell ou tout autre langage de programmation capable d'effectuer facilement des tâches de script (Python, Perl, PHP, Ruby)
la source
cmd
pour que je puisse l'exécuter là-bas. ... Oui, c'est aussi terrible que des sons. Visual Studio me donne parfois envie de pleurer. @ Ajedi32 Je pense que vous vouliez dire que les scripts batch sont une horrible relique du passé. ;)L'humble du commandement a accumulé des capacités intéressantes au fil des ans:
Notez que
"delims="
remplace l'espace par défaut et les délimiteurs de tabulation afin que la sortie de la commande de date soit engloutie en une seule fois.Pour capturer la sortie multiligne, il peut encore s'agir essentiellement d'une ligne unique (en utilisant la variable lf comme délimiteur dans la variable résultante):
Pour capturer une expression canalisée, utilisez
^|
:la source
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
commande directement sur la ligne de commande, vous en utilisez un%
. Si vous l'utilisez dans un fichier de commandes, vous utilisez%%
.%
, par exemple:for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
commande utilisée provienne de Cygwin. Je conviens que j'aurais dû le mentionner.Pour obtenir le répertoire actuel, vous pouvez utiliser ceci:
Il utilise un fichier temporaire, donc ce n'est pas le plus joli, mais cela fonctionne certainement! 'CD' place le répertoire courant dans 'tmpFile', 'SET' charge le contenu de tmpFile.
Voici une solution pour plusieurs lignes avec des "tableaux":
Mais vous voudrez peut-être envisager de passer à un autre shell plus puissant ou de créer une application pour ce genre de choses. Cela étend un peu les possibilités des fichiers batch.
la source
vous devez utiliser la
SET
commande avec le paramètre/P
et y diriger votre sortie. Par exemple, consultez http://www.ss64.com/nt/set.html . Fonctionnera pour CMD, pas sûr des fichiers .BATD'un commentaire à ce post:
la source
Exemple pour définir dans la variable d'environnement "V" le fichier le plus récent
dans un fichier batch, vous devez utiliser le double préfixe dans la variable de boucle:
la source
Utilisez simplement le résultat de la
FOR
commande. Par exemple (dans un fichier batch):Vous pouvez utiliser la
%%I
comme valeur souhaitée. Tout comme ceci:%%I
.Et à l'avance, le
%%I
n'a pas d'espaces ou de caractères CR et peut être utilisé pour des comparaisons !!la source
Si vous recherchez la solution fournie dans Utilisation du résultat d'une commande comme argument dans bash?
alors voici le code:
[Crédits] : Merci à toutes les autres réponses et quelques recherches sur la page des commandes de Windows XP .
la source
la source
Je voudrais ajouter une remarque aux solutions ci-dessus:
Toutes ces syntaxes fonctionnent parfaitement bien SI VOTRE COMMANDE EST TROUVÉE DANS LE CHEMIN ou SI LA COMMANDE EST UN cmdpath SANS ESPACES OU CARACTÈRES SPÉCIAUX.
Mais si vous essayez d'utiliser une commande exécutable située dans un dossier dont le chemin contient des caractères spéciaux, vous devez placer votre chemin de commande entre guillemets doubles (") et la syntaxe FOR / F ne fonctionne pas.
Exemples:
ou
ou
Dans ce cas, la seule solution que j'ai trouvée pour utiliser une commande et stocker son résultat dans une variable est de définir (temporairement) le répertoire par défaut sur celui de la commande elle-même:
Le résultat est alors correct:
Bien sûr, dans l'exemple ci-dessus, je suppose que mon script batch est situé dans le même dossier que celui de ma commande exécutable afin que je puisse utiliser la syntaxe "% ~ d0% ~ p0". Si ce n'est pas votre cas, vous devez trouver un moyen de localiser votre chemin de commande et de remplacer le répertoire par défaut par son chemin.
NB: Pour ceux qui s'interrogent, l'exemple de commande utilisé ici (pour sélectionner un dossier) est FOLDERBROWSE.EXE. Je l'ai trouvé sur le site web f2ko.de ( http://f2ko.de/en/cmd.php ).
Si quelqu'un a une meilleure solution pour ce type de commandes accessible via un chemin complexe, je serai très heureux d'en entendre parler.
Gilles
la source
CALL
. FOR / F ne fonctionne pas si le chemin contient des espacesCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
> fonctionne parfaitement.Vous pouvez capturer toute la sortie dans une variable, mais les lignes seront séparées par un caractère de votre choix (# dans l'exemple ci-dessous) au lieu d'un CR-LF réel.
Deuxième version, si vous devez imprimer le contenu ligne par ligne. Cela prend avantage du fait qu'il n'y aura pas de lignes dupliquées de sortie de "dir / b", donc cela peut ne pas fonctionner dans le cas général.
la source
le résultat est 'TXT: hola'
la source
Vous devez utiliser la
for
commande, voici un exemple:et vous pouvez utiliser
call :output "Command goes here"
alors la sortie sera dans la%output%
variable.Remarque: Si vous avez une sortie de commande multiligne, cet outil affichera
set
la sortie à la dernière ligne de votre commande multiligne.la source
Veuillez vous référer à ce http://technet.microsoft.com/en-us/library/bb490982.aspx qui explique ce que vous pouvez faire avec la sortie de commande.
la source
git pull>0 set /P RESULTVAR=<0
modifier: Je suppose, je ne sais pas comment utiliser les sauts de ligne ici ... chaque commande est sur sa propre ligne.