Windows cmd: Escape-Befehle, um cmd aus einer Batchdatei zu starten und Befehle auszuführen, die zu PATH hinzugefügt werden

Windows cmd: Escape-Befehle, um cmd aus einer Batchdatei zu starten und Befehle auszuführen, die zu PATH hinzugefügt werden

Ich hätte gerne eine cmd-Eingabeaufforderung, die ein Netzwerkverzeichnis einem lokalen Pfad zuordnet und diesen lokalen Pfad dann der (lokalen) PATH-Variable hinzufügt.

Ich habe diese Art von .bat-Skript vorbereitet, das wie erwartet ausgeführt wird:

pushd \\NetworkPath\Users\myname\Downloads
chdir
SET CurrentDir="%~dp0"
SET var=%cd% & SET CDIR=`chdir`
for /f "usebackq" %%x in (`chdir`) do set bvar=%%x
SET PATH=%PATH%;%bvar%
@echo IT IS: %CurrentDir%, %var%, %CDIR%, %bvar% ;;; %PATH% ---  %CD%

Im Wesentlichen ist dies das Skript, das ich beim Start von new ausführen möchte, cmd.exewenn ich die Datei ausführe .bat. Das Problem besteht darin, dass ein Netzwerkpfad, wenn er „gemountet“ wird (z. B. wenn pushdaufgerufen wird), immer einen neuen und anderen lokalen Laufwerksbuchstaben erhält (X:, Y:, Z: ...), sodass ich ermitteln muss, was diesem lokalen Laufwerkspfad entspricht (z. B. über chdir), bevor ich ihn für diese Sitzung zu PATH hinzufügen kann. Außerdem wundere ich mich, warum SET PATH=%PATH%;%bvar%das Semikolon vor dem angehängten Teil immer verdoppelt wird ;, wenn das letzte Verkettungselement ed PATHist echo.

Ich habe gelernt, dass das Prozentzeichen %durch Verdoppelung ( %%) maskiert wird; dass das Et-Zeichen &das Trennzeichen ist, um mehrere Codezeilen zu einer einzigen Zeile zu verketten, die mit dem Caret-Zeichen maskiert wird ^, aber ich bin immer noch verwirrt, weil doppelte Anführungszeichen "entweder wörtlich in Variablen über SET oder außerhalb von zu enden scheinen echo; außerdem scheint der forBefehl immer ausgeführt zu werden (und ich kann ihn nicht mit dem Caret-Zeichen maskieren) – selbst wenn er Teil einer SET-Variablenanweisung ist.

Letztendlich kann ich dieses Skript also nicht in einen Einzeiler umwandeln, sodass ich es als Argument für start.exeStartbefehle verwenden kann. Beachten Sie, dass ich nicht zwei Batchdateien haben möchte, sondern nur eine. Ich möchte dieses Skript zuerst in einer Variablen speichern, damit ich es zum Debuggen wiederholen kann – und so weit bin ich gekommen:

SET TCMD="" pushd \\NetworkPath\Users\myname\Downloads ^& chdir ^& SET CurrentDir="%%~dp0" ^& SET var=^%%cd^%% ^& SET CDIR=^(`chdir`) ^& SET PATH=%%PATH%%;%%CD%% ^& echo %%CurrentDir%%, %%var%%, %%CDIR%%, %%bvar%% ;;; %%PATH%% ---  %%CD%% ""
echo %TCMD%
start cmd.exe /k "%TCMD%"

Problem – die neue cmd.exe startet mit:

'""' is not recognized as an internal or external command,
operable program or batch file.

Dann %CD%bezieht sich auf dievorherigeVerzeichnis (aus dem das .bat-Skript gestartet wurde), nicht in das neue.

Keines davon ruft den neuen Laufwerks-/Pfadnamen ab, wenn es auf diese Weise ausgeführt wird – außer vielleicht for /f "usebackq" %%x in (`chdir`), das ich nicht wirklich erfassen kann (ich kann die Ausgabe sehen) und das auch nicht ganz konsistent zu sein scheint (manchmal scheint es, als würde es „leer“ melden).

Wie kann ich mein erstes Skript maskieren, sodass es als Einzeiler im startArgument meines zweiten Skripts dienen kann, sodass ich cmd.exedas Terminal wie vorgesehen starten kann?

Verweise:

Antwort1

Du denkst viel zu viel darüber nach. Du scheinst den Wald vor lauter Bäumen nicht zu sehen ;-)

Zunächst einmal "%~dp0"gibt es den Speicherort des aktuell ausgeführten Skripts an.nichtdas aktuelle Verzeichnis.

Zweitens verwenden Sie es bereits, %CD%um am Ende das aktuelle Verzeichnis auszudrucken – warum verwenden Sie es nicht, wenn Sie Ihren PATH erweitern?

@echo off
pushd "\\NetworkPath\Users\myname\Downloads"
path %path%;"%cd%"

verwandte Informationen