Batch équivalent des backticks Bash

97

Lorsque je travaille avec Bash, je peux mettre la sortie d'une commande dans une autre commande comme ceci:

my_command `echo Test`

serait la même chose que

my_command Test

(De toute évidence, ce n'est qu'un exemple non pratique.)

Je me demande simplement si vous pouvez faire la même chose dans Batch.

MiffTheFox
la source

Réponses:

53

Vous pouvez le faire en redirigeant d'abord la sortie vers un fichier. Par exemple:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
zvrba
la source
16
Cela vous oblige à trouver un endroit où vous avez un accès en écriture pour stocker le fichier temporaire; vous devez nettoyer après vous-même; cet exemple même ne vous permet de lire que la toute première ligne d'entrée. À toutes fins pratiques, la for /fvariante est bien meilleure.
Joey
@grawity - avec%random%
bacar
1
@joey Il lit chaque ligne, mais comment concaténer à un argument de ligne de commande en une seule commande.
user877329
comment gère-t-il les nouvelles lignes?
andrewrk
103

Vous pouvez obtenir une fonctionnalité similaire à l'aide de scripts cmd.exe avec la for /fcommande:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Ouais, c'est un peu non évident (pour dire le moins), mais c'est ce qu'il y a.

Voir for /?pour les détails sanglants.

Note de bas de page: Je pensais que pour utiliser " echo" à l'intérieur des backticks dans une for /fcommande " ", il faudrait utiliser " cmd.exe /c echo Test" puisque echoc'est une commande interne à cmd.exe, mais cela fonctionne de manière plus naturelle. Les scripts batch Windows me surprennent toujours d'une manière ou d'une autre (mais généralement pas dans le bon sens).

Michael Burr
la source
2
Vous devez généralement le faire lors de l'exécution de shell-builtins à partir de programmes externes qui ne génèrent pas automatiquement un shell. Ie C system()était bien, iirc, car il démarre un shell dans tous les cas, mais .NET a Process.Startbesoin d'appeler explicitement le shell. Quelque chose comme ça, iirc. En tout cas, je considère que c'est la meilleure réponse que celle acceptée :-)
Joey
2
Les options pour forne pas blesser mais confondre le problème. Et à propos de ça:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas
9
Utilisez un seul% au lieu de %% lors de son exécution sur la ligne de commande, plutôt que dans un script batch.
jsears
2
Ne semble pas bien fonctionner avec la tuyauterie, par exemple l'opérateur ">". Mais sinon, c'est génial. À moins que ce ne soit juste un problème% vs %% que j'ai eu.
Jonathan
3
@Evan: tokens=*c'est important. Sinon, si le résultat de la commande comprend des espaces, seul le premier mot est sorti. Exécutez ce à l'invite: for /f %a in ('"echo foo bar"') do echo "%a". Il imprimera "foo".
Dan Dascalescu
29

Lisez la documentation de la commande "for": for /?

Malheureusement, je ne suis pas connecté à Windows pour le vérifier moi-même, mais je pense que quelque chose comme ça peut approximer ce que vous voulez:

for /F %i in ('echo Test') do my_command %i
Weeble
la source
6
Au cas où quelqu'un d'autre trébucherait là-dessus, lorsque la commande est exécutée à partir d'un fichier batch (* .bat), les deux variables% i doivent être le double signe de pourcentage: %% i.
mgouin
3

Vous pouvez toujours exécuter Bash dans Windows. Je le fais tout le temps avec MSYS (beaucoup plus efficace que Cygwin ).

Davr
la source
Malheureusement MSYS est à peine entretenu maintenant, pour obtenir un bash à jour, vous devez l'installer séparément
Ed Randall
1
BusyBox est encore plus petit (~ 432 Ko). Pas un Bash complet cependant, juste Ash. Obtenez le port Windows non officiel ici: frippery.org/busybox
Martin
3

Peut-être que je fous la syntaxe de la for /fméthode standard , mais quand je mets une commande très complexe impliquant && et | dans les backticks dans la limite du for /f, cela pose des problèmes. Une légère modification par rapport à l'habituel est possible pour gérer une commande de complexité arbitraire:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

En plaçant d'abord votre commande complète et complexe dans une variable, puis en mettant une référence à la variable dans la limite plutôt que de placer la commande complexe directement dans la limite de la boucle for, vous pouvez éviter les problèmes d'interprétation de la syntaxe. Actuellement, si je copie la commande exacte que j'ai définie dans la VVvariable de l'exemple ci-dessus dans l'endroit où elle est utilisée %VV%, cela provoque des erreurs de syntaxe.

mtalexan
la source
1
Cela n'a pas fonctionné pour moi, mais j'ai trouvé que vous pouvez faire du piping directement dans la commande for si vous l'échappez avec un carat (^): for / f "usebackq tokens = *" %% a in (`command ^ | command`) faire la commande %% a
Heptite
L'échappement @Heptite Card n'a pas fonctionné pour moi, mais la ligne de commande entourant avec des guillemets doubles a fonctionné.
Alexandr Zarubkin
@Heptite Dans mon cas, je ne connaissais pas la série de commandes que j'allais devoir exécuter au préalable, elles ont été extraites d'un fichier dans un cas et transmises dans un autre. Avec l'échappement, vous devez savoir combien de fois vous devez échapper à la commande en fonction du nombre d'interprètes qu'elle va parcourir, et dans mes cas d'utilisation, ce n'était pas un nombre cohérent d'interprètes.
mtalexan