Configuración y uso de variables dentro de la misma línea de comando en Windows cmd.exe

75

En Bash, puedo hacer EDITOR=vim commandy commandse ejecutará con EDITORset to vim, pero esto no afectará el valor de EDITORen el propio shell. ¿Es posible hacer esto en cmd.exe?

Alexey Romanov
fuente

Respuestas:

53

Tenga en cuenta que cmd /C "set "EDITOR=vim" && echo %EDITOR%"no funcionaría.
Tampoco lo haríacmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Cuál sería la /Vopción, para permitir la expansión variable de entorno diferido utilizando !como delimitador.

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

Como se señala a continuación por maoizm , es cmd /V /C, no cmd /C /V (que no funcionaría)


No puedo pensar en ninguna razón práctica por la que realmente quieras esto en el contexto de un solo comando

Normalmente, necesita esto cuando tiene que reemplazar un valor utilizado varias veces en una línea de comando larga.
Por ejemplo, para implementar un archivo en Nexus (en varias líneas para facilitar la lectura):

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/"

En lugar de tener que reemplazar el grupo, el artefacto (usado 2 veces) y la versión en una línea de comando larga y compleja, puede editarlos al comienzo de dicho comando. Es más claro / fácil manipular y cambiar los valores de los parámetros.

VonC
fuente
1
Probado en mi máquina con Windows 10 versión 1607, el indicador de cmd se bloquea.
Fernando Costa Bertoldi
Tenga en cuenta que EDITOR no se establecerá en 'vim'sino 'vim 'en el último comando. Agregue las comillas internas para evitar el espacio al final.
Zitrax
@Zitrax ¡Correcto! He editado la respuesta en consecuencia.
VonC
1
NB: interesante: el orden de los interruptores importa en este caso. cmd /v/c "..." funciona, pero cmd /c/v "..."falla - espero que pueda ahorrarte 15 minutos
maoizm
1
@DerekGreer "No se me ocurre ninguna razón práctica": OK, he editado la respuesta para agregar una razón práctica.
VonC
50

Puede hacerlo en ventanas como esta sin necesidad de instalar nada.

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

Verá una lista de variables y verá EDITOR = vim, ahora ejecute "set" nuevamente y no aparecerá en la lista.

Puede hacer múltiples && 's para agregar comandos adicionales:

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

EDITAR: / C sale del nuevo cmd inmediatamente después de ejecutarse, si produce una salida con el nuevo, seguirá siendo visible en la ventana principal.

Puede optar por usar / K, en cuyo caso la nueva ventana cmd permanece abierta al final de la ejecución.

Viper_Sb
fuente
55
Ten cuidado. Establecer la variable de esta manera dará como resultado un espacio trailng en la variable EDITOR: "vim". Para evitar el uso del espacio final: cmd / C "set" EDITOR = vim "&& haz esto && haz eso"
Gerd K
1
Esto no funciona en "Windows Server 2008", por ejemplo. Intenté esto: set name = "username" && echo% username%. Y el nombre de usuario está vacío.
akozin
@akozin ¿Te das cuenta de que tienes el valor clave al revés? ¿Quiso decir set name=foo&&echo %name%o set username=foo&&echo %username%?
Phrogz
@akozin mira mi respuesta a continuación
VonC
7

puede usar la utilidad portada envdel paquete CoreUtils en GnuWin32 http://gnuwin32.sourceforge.net/

  1. Configurarlo
  2. Verifique qué directorio env.exeexiste en la variable% PATH%
  3. Use de la misma manera que la versión de Linux env EDITOR=vim command
Skotina Roja
fuente
tal vez valga la pena decir que si tiene git / docker / msys / cygwin ya tendrá una versión de esto.
xenoterracide
3

He generado un archivo por lotes env.cmdque funciona más o menos como el envcomando de 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 única diferencia es que, debido a la forma en que se cmdanaliza, se deben citar las asignaciones de entorno, por lo que su comando sería:

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

El archivo por lotes podría elaborarse para eliminar la restricción de 8 parámetros mediante la construcción de la cadena de comandos dentro del forbucle (se necesitará una expansión retardada).

AFH
fuente
¿Por qué no solo usar %*como penúltima línea (es decir, la que está después de la :DoCmdetiqueta) para permitir comandos de usuario muy largos?
Scott
@Scott - Porque %*es la lista de parámetros original : no se ve afectada por shift(a diferencia $*de Unix).
AFH