15 votes

L'équivalent de $() de Bash sous Windows ?

Avec Bash, je peux utiliser un subshell pour remplir le résultat d'une commande dans la suivante :

$ echo $(sub-command args)

et si $(sub-command args) a écrit foo à la sortie standard, alors la commande ci-dessus serait équivalente à :

$ echo foo

Est-ce que Windows 7 a un moyen de faire cela en cmd.exe ?

La raison pour laquelle je veux faire cela est que je peux facilement exécuter des exécutables à partir du répertoire d'installation de npm sans avoir ce répertoire dans mon chemin :

$ $(npm bin)/grunt build

8voto

Jorge Valentini Points 424

Comme ils l'ont déjà indiqué dans les commentaires, il n'y a pas de moyen natif de faire cela avec cmd. Cependant, il y a un hack que vous pouvez utiliser dans votre cas (comme npm bin ne renvoie qu'une seule ligne) :

for /F "tokens=*" %n IN ('npm bin') DO @(%n\grunt build)

ou à l'intérieur d'un fichier batch, vous devez dupliquer l'adresse de l'utilisateur. % :

for /F "tokens=*" %%n IN ('npm bin') DO @(%%n\grunt build)

Alternatives

Lot

Vous pourriez générer un script qui reçoit le paramètre et exécute la commande, quelque chose comme

:: Takes the parameters and send to npm bin output
for /f "tokens=*" %%n in ('npm bin') do @(%%n\%1 %2 %3 %4 %5)

Enregistrez-le sous le nom de npmbin.cmd dans votre chemin, puis vous pourrez l'exécuter :

npmbin.cmd grunt build

Powershell

Dans votre cas, vous devriez pouvoir l'invoquer via powershell en utilisant le cmdlet invoke-expression :

iex "$(npm bin)\grunt build"

Je n'ai pas npm sur moi pour l'instant, mais j'ai testé avec un autre programme et il semble que cela pourrait fonctionner.

Variable d'environnement

De toute façon, je pense que les précédentes sont des "solutions" très compliquées, alors que vous voulez seulement simplifier votre commande. Je me demandais si vous pouviez créer une variable globale, par exemple NPMBIN et ensuite l'utiliser pour vos commandes :

%NPMBIN%\grunt build

Pour aller plus loin, vous pourriez mettre en place une tâche pour le paramétrer de façon programmatique pour votre utilisateur (ou éventuellement l'ordinateur) en utilisant setx un certain lot comme :

for /f "tokens=*" %%n in ('npm bin') do @(setx NPMBIN %%n)

J'espère que cela vous aidera. Salutations

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X