it-swarm.com.de

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

In Bash kann ich EDITOR=vim command ausführen und command wird ausgeführt, wenn EDITOR auf vim eingestellt ist, dies hat jedoch keine Auswirkungen auf den Wert von EDITOR in der Shell. Ist es möglich, dies in cmd.exe zu tun?

69
Alexey Romanov

Beachten Sie, dass cmd /C "set "EDITOR=vim" && echo %EDITOR%" nicht funktionieren würde.
Auch würde cmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

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

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

Wie unten von maoizm vermerkt, ist es cmd /V /C, not cmd /C /V (was nicht funktionieren würde)


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 klarer/einfacher, die Parameterwerte zu manipulieren und zu ändern.

49
VonC

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.

49
Viper_Sb

sie können portiertes util env aus dem Paket CoreUtils in GnuWin32 verwenden http://gnuwin32.sourceforge.net/

  1. Richten Sie es ein
  2. Überprüfen Sie, welches Verzeichnis mit env.exe in der Variablen% PATH% vorhanden ist
  3. Verwenden Sie den gleichen Weg wie die Linux-Version env EDITOR=vim command
7
Red Skotina

Ich habe eine Batch-Datei env.cmd hochgefahren, die mehr oder weniger wie der Linux-Befehl env 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 und Weise, in der cmd analysiert wird, 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 in der for-Schleife aufgebaut wird (eine verzögerte Erweiterung ist erforderlich).

3
AFH