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

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

In Bash kann ich Folgendes tun EDITOR=vim commandund commandwird mit dem Wert auf ausgeführt , aber dies hat keine Auswirkungen auf den Wert von in der Shell selbst. Ist es möglich, dies in zu tun ?EDITORvimEDITORcmd.exe

Antwort1

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

Du bräuchtest:

  • die /VOption, die verzögerte Erweiterung von Umgebungsvariablen durch Verwendung !als Trennzeichen zu aktivieren.
  • kein Leerzeichen zwischen einem Befehl und dem &&(oder Anführungszeichen hinzufügen)

Das ist:

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

AlsUnten angegebenvonMaoismus, es ist cmd /V /C,nicht cmd /C /V(was würdenichtarbeiten)


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

Normalerweise benötigen Sie dies, wenn Sie einen Wert ersetzen müssen, der in einer langen Befehlszeile mehrfach verwendet wird.
Um beispielsweise eine Datei auf Nexus bereitzustellen (in mehreren Zeilen zur besseren Lesbarkeit):

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 (zweimal verwendet) und Version in einer langen und komplexen Befehlszeile ersetzen zu müssen, können Sie diese an derAnfangdes besagten Befehls. Es ist klarer/einfacher, die Parameterwerte zu manipulieren und zu ändern.

Antwort2

Sie können es in einem solchen Windows tun, ohne dass Sie etwas installieren müssen.

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

Sie sehen eine Liste mit Variablen und EDITOR=vim. Führen Sie „set“ jetzt erneut aus, und die Variablen werden nicht mehr aufgelistet.

Sie können mehrere &&'s verwenden, um zusätzliche Befehle hinzuzufügen:

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

BEARBEITEN: /C beendet den neuen Befehl sofort nach der Ausführung. Wenn Sie mit dem neuen Befehl eine Ausgabe erzeugen, ist diese weiterhin im übergeordneten Fenster sichtbar.

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

Antwort3

envSie können portierte Utilities aus dem Paket CoreUtils in GnuWin32 verwendenhttp://gnuwin32.sourceforge.net/

  1. Richten Sie es ein
  2. Überprüfen Sie, welches Verzeichnis env.exein der Variable %PATH% vorhanden ist
  3. Verwenden Sie es auf die gleiche Weise wie die Linux-Version env EDITOR=vim command

Antwort4

Ich habe eine Batchdatei zusammengeschustert env.cmd, die 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 cmddie Umgebungszuweisungen aufgrund der Art und Weise der Analyse in Anführungszeichen gesetzt werden müssen. Ihr Befehl würde also folgendermaßen lauten:

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

Die Batchdatei könnte erweitert werden, um die 8-Parameter-Einschränkung zu entfernen, indem die Befehlszeichenfolge innerhalb der forSchleife erstellt wird (eine verzögerte Erweiterung ist erforderlich).

verwandte Informationen