Definindo e usando variável dentro da mesma linha de comando no Windows cmd.exe

58

No Bash, posso fazer EDITOR=vim command e command serão executados com EDITOR definido como vim , mas isso não afetará o valor de EDITOR no próprio shell. É possível fazer isso em cmd.exe ?

    
por Alexey Romanov 17.12.2010 / 16:04

4 respostas

39

Observe que cmd /C "set "EDITOR=vim" && echo %EDITOR%" não funcionaria.
Nem cmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Qual seria a opção /V , para ativar a expansão da variável de ambiente atrasada usando ! como delimitador.

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

Como mencionado abaixo por maoizm , é cmd /V /C , não cmd /C /V (o que não funciona)

I can't think of any practical reason you'd ever actually want this within the context of a single command

Normalmente, você precisa disso quando precisar substituir um valor usado várias vezes em uma linha de comando longa.
Por exemplo, para implantar um arquivo no Nexus (em várias linhas para facilitar a leitura):

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

Em vez de ter que substituir grupo, artefato (usado 2 vezes) e versão em uma linha de comando longa e complexa, você pode editá-los no início do dito comando. É mais fácil / mais fácil manipular e alterar os valores dos parâmetros.

    
por 05.08.2015 / 08:02
46

Você pode fazer isso em janelas como esta, sem necessidade de instalar nada.

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

Você verá uma lista de variáveis e verá EDITOR = vim, agora executará "set" novamente e não será listado.

Você pode fazer vários &; s para adicionar comandos adicionais:

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

EDITAR: / C sai do novo cmd imediatamente após a execução, se você produzir a saída com o novo, ele ainda estará visível na janela pai.

Você pode optar por usar / K e, nesse caso, a nova janela do cmd permanecerá aberta no final da execução.

    
por 17.12.2010 / 16:58
6

você pode usar o utilitário ported env do pacote CoreUtils no GnuWin32 link

  1. Configurar
  2. Verifique qual diretório com env.exe existe na variável% PATH%
  3. Use da mesma forma que a versão linux %código%
por 22.05.2016 / 15:13
3

Eu instalei um arquivo de lote env.cmd , que funciona mais ou menos como o comando env do 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

A única diferença é que, devido à maneira como cmd analisa, as atribuições de ambiente precisam ser citadas, então seu comando seria:

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

O arquivo em lote pode ser elaborado para remover a restrição de 8 parâmetros construindo a cadeia de comando dentro do for loop (será necessária uma expansão atrasada).

    
por 21.05.2016 / 18:48