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.