Festlegen und Verwenden von Variablen in derselben Befehlszeile in Windows cmd.exe

75

In Bash kann EDITOR=vim commandund commandwird mit EDITORset to ausgeführt vim, dies hat jedoch keinen Einfluss auf den Wert EDITORin der Shell. Ist es möglich, dies in zu tun cmd.exe?

Alexey Romanov
quelle

Antworten:

52

Beachten Sie, dass cmd /C "set "EDITOR=vim" && echo %EDITOR%"dies nicht funktionieren würde.
Wäre es auch nichtcmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Was wäre die /VOption, die verzögerte Erweiterung von Umgebungsvariablen mit !als Begrenzer zu aktivieren .

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

Wie unten angegeben von maoizm ist es cmd /V /C, nicht cmd /C /V (das würde nicht funktionieren)


Ich kann mir keinen praktischen Grund vorstellen, warum Sie dies jemals im Kontext eines einzelnen Befehls wollen würden

In der Regel benötigen Sie dies, wenn Sie einen Wert ersetzen müssen, der in einer langen Befehlszeile mehrfach verwendet wird.
So stellen Sie beispielsweise eine Datei für Nexus bereit (aus Gründen der Lesbarkeit in mehreren Zeilen):

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

Anstatt Gruppe, Artefakt (2-mal verwendet) und Version in einer langen und komplexen Befehlszeile ersetzen zu müssen, können Sie sie am Anfang des Befehls bearbeiten . Es ist übersichtlicher / einfacher, die Parameterwerte zu manipulieren und zu ändern.

VonC
quelle
1
Getestet auf meinem Computer mit Windows 10, Version 1607, stürzt die cmd-Eingabeaufforderung ab.
Fernando Costa Bertoldi
Beachten Sie, dass EDITOR nicht auf, 'vim'sondern 'vim 'auf den letzten Befehl gesetzt wird. Fügen Sie die internen Anführungszeichen hinzu, um das Leerzeichen am Ende zu vermeiden.
Zitrax
@ Zitrax Richtig! Ich habe die Antwort entsprechend bearbeitet.
Vom
1
Hinweis: Interessant: In diesem Fall ist die Reihenfolge der Schalter von Bedeutung. cmd /v/c "..." funktioniert, cmd /c/v "..."scheitert aber - hoffentlich kann es Ihnen 15 Minuten sparen
Maoizm
1
@DerekGreer "Ich kann mir keinen praktischen Grund vorstellen": OK, ich habe die Antwort bearbeitet, um einen praktischen Grund hinzuzufügen.
Vom
50

Sie können dies in solchen Fenstern tun, ohne etwas installieren zu müssen.

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

Sie sehen eine Liste mit Variablen und sehen EDITOR = vim. Führen Sie jetzt "set" erneut aus und es wird nicht aufgelistet.

Sie können mehrere && ausführen, um zusätzliche Befehle hinzuzufügen:

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

BEARBEITEN: / C beendet den neuen Befehl sofort nach dem Ausführen. Wenn Sie eine Ausgabe mit dem neuen Befehl erstellen, wird dieser weiterhin im übergeordneten Fenster angezeigt.

Sie können / K verwenden. In diesem Fall bleibt das neue cmd-Fenster am Ende des Laufs geöffnet.

Viper_Sb
quelle
5
Achtung. Wenn Sie die Variable auf diese Weise einstellen, wird in der Variablen EDITOR: "vim" ein Leerzeichen hinterlegt. Um das nachfolgende Leerzeichen zu vermeiden, verwenden Sie: cmd / C "set" EDITOR = vim "&& do this && do that"
Gerd K
1
Dies funktioniert beispielsweise nicht unter "Windows Server 2008". Ich habe es versucht: set name = "username" && echo% username%. Und der Benutzername ist leer.
Akozin
@akozin Weißt du, dass du den Schlüsselwert falsch verstanden hast? Meinten Sie set name=foo&&echo %name%oder set username=foo&&echo %username%?
Phrogz,
@akozin siehe meine Antwort unten
VonC
7

Sie können portiertes Util envaus dem Paket CoreUtils in GnuWin32 verwenden. http://gnuwin32.sourceforge.net/

  1. Richten Sie es ein
  2. Überprüfen Sie, welches Verzeichnis env.exein der Variablen% PATH% vorhanden ist
  3. Verwenden Sie den gleichen Weg wie die Linux-Version env EDITOR=vim command
Rote Skotina
quelle
Vielleicht lohnt es sich zu sagen, dass Sie, wenn Sie git / docker / msys / cygwin haben, bereits eine Version davon haben.
Xenoterracide
3

Ich habe eine Batch-Datei hochgefahren, env.cmddie mehr oder weniger wie der Linux- envBefehl funktioniert :

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

Der einzige Unterschied besteht darin, dass aufgrund der Art cmdund Weise der Analyse die Umgebungszuweisungen in Anführungszeichen gesetzt werden müssen. Ihr Befehl lautet also :

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

Die Batch-Datei könnte ausgearbeitet werden, um die 8-Parameter-Einschränkung zu beseitigen, indem die Befehlszeichenfolge innerhalb der forSchleife aufgebaut wird (eine verzögerte Erweiterung ist erforderlich).

AFH
quelle
Warum nicht einfach %*als vorletzte Zeile (dh nach der :DoCmdBezeichnung) verwenden, um sehr lange Benutzerbefehle zu ermöglichen?
Scott
@Scott - Da %*es sich um die ursprüngliche Parameterliste handelt: Sie wird von shift(im Gegensatz $*zu Unix) nicht beeinflusst.
AFH