web-dev-qa-db-fra.com

Équivalent par lots de backticks Bash

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.

88
MiffTheFox

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%
54
zvrba

Vous pouvez obtenir une fonctionnalité similaire en utilisant des scripts cmd.exe avec le for /f commande:

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

Oui, ce n'est pas évident (pour dire le moins), mais c'est ce qui est là.

Voir for /? pour les détails sanglants.

Sidenote: Je pensais que pour utiliser "echo" à l'intérieur des backticks dans un "for /f "la commande devrait être effectuée en utilisant" cmd.exe /c echo Test "puisque echo est une commande interne à cmd.exe, mais cela fonctionne de manière plus naturelle. Les scripts batch de Windows me surprennent toujours en quelque sorte (mais généralement pas dans le bon sens).

96
Michael Burr

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
27
Weeble

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

3
davr

Peut-être que je bousille la syntaxe de la norme for /f méthode, mais quand je mets une commande très complexe impliquant && et | dans les backticks dans la limite du for /f, cela cause 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 plaçant 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 variable VV dans l'exemple ci-dessus, où elle est utilisée, %VV%, il provoque des erreurs de syntaxe.

3
mtalexan