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

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

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

Respuesta1

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

Necesitarías:

  • la /Vopción para habilitar la expansión retardada de la variable de entorno utilizando !como delimitador.
  • sin espacio entre un comando y &&(o agregar comillas)

Eso es:

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

Comoanotado abajopormaoizmo, es cmd /V /C,no cmd /C /V(Cuál deberíanotrabajar)


No se me ocurre ninguna razón práctica por la que alguna vez 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 grupo, artefacto (usado 2 veces) y versión en una línea de comando larga y compleja, puede editarlos en elcomienzode dicho comando. Es más claro/fácil manipular y cambiar los valores de los parámetros.

Respuesta2

Puedes hacerlo en Windows como este 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.

Puedes hacer múltiples && para agregar comandos adicionales:

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

EDITAR: /C sale del nuevo cmd inmediatamente después de ejecutarlo; si genera resultados con el nuevo, aún estará visible en la ventana principal.

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

Respuesta3

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

  1. Configurarlo
  2. Compruebe qué directorio env.exeexiste en la variable %PATH%
  3. Usar de la misma manera que la versión de Linux. env EDITOR=vim command

Respuesta4

He creado 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 cmdde análisis, las asignaciones de entorno deben citarse, 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 creando la cadena de comando dentro del forbucle (será necesaria una expansión retrasada).

información relacionada