145 votes

Définition et utilisation de variables dans la même ligne de commande dans Windows cmd.exe

En Bash, je peux faire EDITOR=vim command y command sera exécuté avec EDITOR réglé sur vim mais cela n'affectera pas la valeur de l'option EDITOR dans le Shell lui-même. Est-il possible de le faire dans cmd.exe ?

92voto

Runeslinger Points 9379

Notez que cmd /C "set "EDITOR=vim" && echo %EDITOR%" ne fonctionnerait pas.
Pas plus que cmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Vous auriez besoin :

  • el /V pour activer l'expansion différée des variables d'environnement en utilisant ! comme délimiteur.
  • pas d'espace entre une commande et le && (ou ajouter des citations)

C'est-à-dire :

C:\> cmd /V /C "set EDITOR=vim&& echo '!EDITOR!'"
'vim'
# or
C:\> cmd /V /C "set "EDITOR=vim" && echo '!EDITOR!'"
'vim'

Comme noté ci-dessous por maoizm c'est cmd /V /C , no cmd /C /V (ce qui no travail)


Je ne vois aucune raison pratique pour laquelle vous voudriez que cela soit fait dans le cadre d'une seule commande.

En général, vous en avez besoin lorsque vous devez remplacer une valeur utilisée plusieurs fois dans une longue ligne de commande.
Par exemple, pour déployer un fichier sur Nexus (en plusieurs lignes pour plus de lisibilité) :

cmd /v /c "set g=com.agroup&& set a=anArtifact&& set v=1.1.0&& \
           mvn deploy:deploy-file -Dfile=C:\path\!a!-!v!.jar \
           -Dpackaging=jar -DgroupId=!g! -DartifactId=!a! -Dversion=!v! \
           -DrepositoryId=nexus 
           -Durl=http://myserver/nexus/content/repositories/my-repo/"

Au lieu de devoir remplacer le groupe, l'artefact (utilisé 2 fois) et la version dans une ligne de commande longue et complexe, vous pouvez les éditer à l'adresse suivante débutant de ladite commande. Il est plus clair/facile de manipuler et de modifier les valeurs des paramètres.

61voto

Viper_Sb Points 1016

Vous pouvez le faire dans Windows comme ceci sans avoir besoin d'installer quoi que ce soit.

cmd /C "set EDITOR=vim && set"

Vous verrez une liste de variables et vous verrez EDITOR=vim, maintenant lancez "set" à nouveau et il ne sera pas listé.

Vous pouvez faire plusieurs && pour ajouter des commandes supplémentaires :

cmd /C "set EDITOR=vim && do this && do that && otherstuff"

EDIT : /C quitte la nouvelle commande immédiatement après son exécution, si vous produisez une sortie avec la nouvelle commande, elle sera toujours visible dans la fenêtre parent.

Vous pouvez choisir d'utiliser /K, auquel cas la nouvelle fenêtre cmd reste ouverte à la fin de l'exécution.

13voto

Red Skotina Points 133

Vous pouvez utiliser des utilitaires portés env du paquet CoreUtils dans GnuWin32 http://gnuwin32.sourceforge.net/

  1. Configurez-le
  2. Vérifiez quel répertoire avec env.exe existe dans la variable %PATH
  3. Utiliser de la même manière que la version linux env EDITOR=vim command

6voto

Julio Points 176

La réponse de Vonc fonctionnera pour les commandes qui font référence à la variable telle qu'elle est développée (c'est-à-dire !FOO! au lieu de %FOO% )

Cependant, cela ne fonctionnera pas si votre commande fait référence à une variable ordinaire.

Par exemple, considérez :

some-bat.bat (ou tout autre exécutable/processus batch)

echo %FOO%

Et le processus principal :

set FOO=foo
cmd /V /C "set FOO=bar && some-bat.bat"

Renvoie à foo au lieu de bar (une deuxième exécution fonctionnerait quand même)

Mais tout de même, vous pourriez concaténer un nouveau processus cmd pour forcer le rafraîchissement de la variable.

Comme ça :

set "FOO=BAR" && cmd /c "echo %FOO%"

Ou dans le cas où la commande principale devait déjà utiliser une nouvelle cmd :

cmd /c "set FOO=BAR && cmd /c ^"echo %FOO%^""

5voto

AFH Points 16642

J'ai créé un fichier batch env.cmd qui fonctionne plus ou moins comme le système Linux env commande:-

echo off
setlocal
for %%f in (%*) do (
  echo %%f|find "=" >nul:
  if errorlevel 1 goto DoCmd
  set %%f
  shift
)
:DoCmd
%1 %2 %3 %4 %5 %6 %7 %8 %9
endlocal

La seule différence est que, en raison de la façon dont cmd est analysé, les affectations d'environnement doivent être citées, donc votre commande serait :

env "EDITOR=vim" command [up to 8 parameters]

Le fichier batch peut être élaboré pour supprimer la restriction des 8 paramètres en construisant la chaîne de commande dans le fichier de base. for boucle (une extension différée sera nécessaire).

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