web-dev-qa-db-fra.com

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

Dans Bash, je peux faire EDITOR=vim command et command seront exécutés avec EDITOR défini sur vim, mais cela n'affectera pas la valeur de EDITOR dans le shell lui-même. Est-il possible de faire cela dans cmd.exe?

69
Alexey Romanov

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

Quelle serait l'option /V, pour activer le développement d'une variable d'environnement retardée en utilisant ! comme délimiteur.

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

Comme indiqué ci-dessous par maoizm , il s’agit de cmd /V /C, pas cmd /C /V (ce qui ne fonctionnerait pas )


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 ladite commande. Il est plus facile/clair de manipuler et de changer les valeurs des paramètres.

49
VonC

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.

49
Viper_Sb

vous pouvez utiliser ported util env du paquet CoreUtils dans GnuWin32 http://gnuwin32.sourceforge.net/

  1. Le configurer
  2. Vérifiez quel répertoire avec env.exe existe dans la variable% PATH%
  3. Utilisez la même manière que la version linux env EDITOR=vim command
7
Red Skotina

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

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 analyse, les affectations d'environnement doivent être citées. Par conséquent, votre commande serait:

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

Le fichier de commandes peut être élaboré pour supprimer la restriction de 8 paramètres en créant la chaîne de commande dans la boucle for (un développement retardé sera nécessaire).

3
AFH