Impostazione e utilizzo della variabile nella stessa riga di comando in Windows cmd.exe


75

In Bash, posso fare EDITOR=vim commande commandverrà eseguito con EDITORset to vim, ma questo non influirà sul valore della EDITORshell stessa. È possibile farlo in cmd.exe?

Risposte:


53

Nota che cmd /C "set "EDITOR=vim" && echo %EDITOR%"non funzionerebbe.
Né lo farebbecmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Quale sarebbe l' /Vopzione, per abilitare l'espansione ritardata della variabile d'ambiente usando !come delimitatore.

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

Come elencati di seguito per maoizm , è cmd /V /C, non cmd /C /V (che non funziona)


Non riesco a pensare a nessun motivo pratico che tu abbia mai desiderato davvero nel contesto di un singolo comando

In genere, questo è necessario quando è necessario sostituire un valore utilizzato più volte in una lunga riga di comando.
Ad esempio, per distribuire un file su Nexus (in più righe per leggibilità):

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

Invece di dover sostituire gruppo, artefatto (usato 2 volte) e versione in una riga di comando lunga e complessa, è possibile modificarli all'inizio di detto comando. È più chiaro / semplice manipolare e modificare i valori dei parametri.


1
Provato sul mio computer con Windows 10 versione 1607, il prompt cmd si arresta in modo anomalo.
— Fernando Costa Bertoldi,

Si noti che EDITOR non sarà impostato su 'vim'ma 'vim 'nell'ultimo comando. Aggiungi le virgolette interne per evitare lo spazio alla fine.
— Zitrax,

@Zitrax Giusto! Ho modificato la risposta di conseguenza.
— VonC,

1
NB: interessante: l'ordine degli switch conta in questo caso. cmd /v/c "..." funziona, ma cmd /c/v "..."fallisce - si spera che possa farti risparmiare 15 minuti
— maoizm

1
@DerekGreer "Non riesco a pensare a nessun motivo pratico": OK, ho modificato la risposta per aggiungere un motivo pratico.
— VonC,

50

Puoi farlo in Windows come questo senza bisogno di installare nulla.

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

Vedrai un elenco di variabili e vedrai EDITOR = vim, ora esegui di nuovo "set" e non verrà elencato.

Puoi fare più & 'per aggiungere ulteriori comandi:

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

EDIT: / C esce subito dal nuovo cmd dopo l'esecuzione, se si produce un output con quello nuovo sarà comunque visibile nella finestra padre.

Puoi scegliere di usare / K nel qual caso la nuova finestra cmd rimane aperta alla fine della corsa.


5
Stai attento. Impostando la variabile in questo modo si otterrà uno spazio di trascinamento nella variabile EDITOR: "vim". Per evitare lo spazio finale utilizzare: cmd / C "set" EDITOR = vim "&& fare questo && farlo"
— Gerd K

1
Questo non funziona su "Windows Server 2008", ad esempio. Ho provato questo: set name = "username" && echo% username%. E il nome utente è vuoto.
— akozin,

@akozin Ti rendi conto di avere il valore chiave all'indietro? Intendevi set name=foo&&echo %name%o set username=foo&&echo %username%?
— Phrogz,

@akozin vedi la mia risposta qui sotto
— VonC

7

è possibile utilizzare util ported envdal pacchetto CoreUtils in GnuWin32 http://gnuwin32.sourceforge.net/

  1. Installalo
  2. Controlla quale directory env.exeesiste nella variabile% PATH%
  3. Usa allo stesso modo della versione Linux env EDITOR=vim command

forse vale la pena dire che se hai git / docker / msys / cygwin avrai già una versione di questo.
— xenoterracide,

3

Ho rovesciato un file batch env.cmdche funziona più o meno come il 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

L'unica differenza è che, a causa del modo in cui vengono cmdanalizzate, le assegnazioni di ambiente devono essere quotate, quindi il tuo comando sarebbe:

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

Il file batch potrebbe essere elaborato per rimuovere la restrizione di 8 parametri creando la stringa di comando all'interno del forciclo (sarà necessaria un'espansione ritardata).


Perché non usare solo %*come penultima riga (cioè quella dopo l' :DoCmdetichetta) per consentire comandi utente molto lunghi?
— Scott,

@Scott - Perché %*è l' elenco dei parametri originale : non è interessato da shift(diversamente da $*Unix).
— AFH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.