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

75

Dans Bash, je peux faire EDITOR=vim commandet commandserai exécuté avec EDITORset to vim, mais cela n’affectera pas la valeur de EDITORdans le shell lui-même. Est-il possible de faire cela dans cmd.exe?

Alexey Romanov
la source

Réponses:

53

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

Quelle serait l' /Voption, pour permettre l'expansion retardée des variables d'environnement en utilisant !comme délimiteur.

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

Comme indiqué ci - dessous par maoizm , il est cmd /V /C, pas cmd /C /V (qui ne fonctionne)


Je ne vois aucune raison pratique de vouloir réellement cela dans le contexte d'une seule commande

En règle générale, 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 (sur plusieurs lignes, par souci 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 groupe, artefact (utilisé 2 fois) et version dans une ligne de commande longue et complexe, vous pouvez les modifier au début de cette commande. Il est plus facile / clair de manipuler et de changer les valeurs des paramètres.

VonC
la source
1
Testé sur ma machine avec Windows 10 version 1607, l'invite cmd se bloque.
Fernando Costa Bertoldi
Notez que EDITOR ne sera pas défini sur 'vim'mais 'vim 'dans la dernière commande. Ajoutez les guillemets internes pour éviter tout espace à la fin.
Zitrax
@Zitrax droit! J'ai édité la réponse en conséquence.
VonC
1
NB: intéressant: l'ordre des commutateurs compte dans ce cas. ça cmd /v/c "..." marche, mais cmd /c/v "..."ça échoue - avec un peu de
chance
1
@DerekGreer "Je ne vois aucune raison pratique": OK, j'ai modifié la réponse pour ajouter une raison pratique.
VonC
50

Vous pouvez le faire dans des fenêtres comme celle-ci 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, exécutez maintenant "set" à nouveau et il ne sera pas répertorié.

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 cmd immédiatement après son exécution. Si vous produisez une sortie avec la nouvelle, elle sera toujours visible dans la fenêtre parente.

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

Viper_Sb
la source
5
Faites attention. Définir la variable de cette façon entraînera un espace dans la variable EDITOR: "vim". Pour éviter l'espace de fin, utilisez: cmd / C "set" EDITOR = vim "&& do this && do that"
Gerd K
1
Cela ne fonctionne pas sur "Windows Server 2008", par exemple. J'ai essayé ceci: set name = "nom d'utilisateur" && echo% nom d'utilisateur%. Et le nom d'utilisateur est vide.
akozin
@akozin Savez-vous que vous avez la valeur clé à l'envers? Vouliez-vous dire set name=foo&&echo %name%ou set username=foo&&echo %username%?
Phrogz
@akozin voir ma réponse ci
VonC
7

vous pouvez utiliser l' envutilitaire porté du paquet CoreUtils dans GnuWin32 http://gnuwin32.sourceforge.net/

  1. Le configurer
  2. Vérifier quel répertoire env.exeexiste dans la variable% PATH%
  3. Utilisez la même manière que la version linux env EDITOR=vim command
Skotina rouge
la source
Cela vaut peut-être la peine de dire que si vous avez git / docker / msys / cygwin, vous en avez déjà une version.
xenoterracide
3

J'ai bricolé un fichier de commandes env.cmdqui fonctionne plus ou moins comme la envcommande Linux : -

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 qu'en raison de la façon dont les cmdanalyses sont effectuées, les assignations d'environnement doivent être citées. Votre commande serait donc:

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

Le fichier de commandes pourrait être élaboré pour supprimer la restriction de 8 paramètres en créant la chaîne de commande dans la forboucle (une expansion retardée sera nécessaire).

AFH
la source
Pourquoi ne pas simplement utiliser %*l'avant-dernière ligne (c'est-à-dire celle qui suit l' :DoCmdétiquette) pour autoriser des commandes utilisateur très longues?
Scott
@Scott - Car %*est la liste de paramètres d' origine : elle n'est pas affectée par shift(contrairement $*à Unix).
AFH