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.


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%

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


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

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.