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

75

No Bash, eu posso fazer EDITOR=vim commande commandserá executado com EDITORset como vim, mas isso não afetará o valor do EDITORpróprio shell. É possível fazer isso cmd.exe?

Alexey Romanov
fonte

Respostas:

53

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

O que seria a /Vopção, para permitir a expansão atrasada da variável de ambiente usando !como delimitador.

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

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


Não consigo pensar em nenhuma razão prática para você realmente querer isso dentro do contexto de um único comando

Normalmente, você precisa disso quando precisar substituir um valor usado várias vezes em uma longa linha de comando.
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 precisar substituir o grupo, o artefato (usado 2 vezes) e a versão em uma linha de comando longa e complexa, você pode editá-los no início do referido comando. É mais claro / fácil manipular e alterar os valores dos parâmetros.

VonC
fonte
11
Testei na minha máquina com o Windows 10 versão 1607, o prompt do cmd falha.
Fernando Costa Bertoldi
Observe que EDITOR não será definido como 'vim'mas 'vim 'no último comando. Adicione as aspas internas para evitar o espaço no final.
Zitrax 03/02
@Zitrax Right! Eu editei a resposta de acordo.
VonC 03/02/19
11
NB: interessante: a ordem dos switches é importante neste caso. cmd /v/c "..." funciona, mas cmd /c/v "..."não - espero que ele pode poupar 15 minutos
maoizm
11
@DerekGreer "Não consigo pensar em nenhuma razão prática": OK, editei a resposta para adicionar uma razão prática.
VonC
50

Você pode fazê-lo em janelas como essa, sem necessidade de instalar nada.

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

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

Você pode executar vários && 's para adicionar comandos adicionais:

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

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

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

Viper_Sb
fonte
5
Seja cuidadoso. Definir a variável dessa maneira resultará em um espaço à direita na variável EDITOR: "vim". Para evitar o espaço à direita, use: cmd / C "set" EDITOR = vim "&& faça isso && faça isso"
Gerd K
11
Isso não está funcionando no "Windows Server 2008", por exemplo. Eu tentei isso: set name = "nome de usuário" && echo% username%. E o nome de usuário está vazio.
akozin
@akozin Você percebe que recebeu o valor-chave ao contrário? Você quis dizer set name=foo&&echo %name%ou set username=foo&&echo %username%?
Phrogz
@akozin veja minha resposta abaixo
VonC
7

você pode usar o envutilitário portado do pacote CoreUtils no GnuWin32 http://gnuwin32.sourceforge.net/

  1. Configure
  2. Verifique com que diretório env.exeexiste a variável% PATH%
  3. Use da mesma maneira que a versão linux env EDITOR=vim command
Skotina vermelha
fonte
talvez valha a pena dizer que, se você possui git / docker / msys / cygwin, já terá uma versão disso.
Xenoterracide
3

Eu bati um arquivo em lotes env.cmdque funciona mais ou menos como o envcomando 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 cmdanalisa, as atribuições do ambiente precisam ser citadas; portanto, 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 comandos dentro do forloop (será necessária expansão atrasada).

AFH
fonte
Por que não usar apenas %*como a penúltima linha (ou seja, a que segue o :DoCmdrótulo) para permitir comandos de usuário muito longos?
22416 Scott
@ Scott - Porque %*é a lista de parâmetros original : ela não é afetada por shift(ao contrário $*do Unix).
AFH 23/05