Batch-Ausgabe auf CD-Befehl umleiten
Ich habe eine Batch-Datei, die einen Pfad ausgibt. Wie kann ich die Batchdatei in Windows cmd verwenden, um das aktuelle Verzeichnis zu ändern?
Was habe ich versucht:
F:\>cd my-path.bat
The system cannot find the path specified.
F:\>cd (my-path.bat)
The system cannot find the path specified.
F:\>my-path.bat | cd
F:\
The process tried to write to a nonexistent pipe.
my-path.bat Inhalt:
@ECHO OFF
@ECHO F:\MyPath\
Antworten
for /f "delims=" %d in ('my-path.bat') do cd /d "%~d"
Hinweis: In einer Batchdatei müssen Sie% durch %% ersetzen
Für verschiedene Treiber benötigen Sie /din Ihrem cdBefehl
Wenn Ihr Ordner / Pfad / Name Leerzeichen / Sonderzeichen enthält, verwenden Sie auch doppelte Anführungszeichen
@echo off
echo\"F:\path to your folder"
:: or add/replace echo\"F:\path to your folder" to cd /d ::
cd /d "F:\path\to\folder"
Eine Alternative wäre, die Ausgabe in einer Schleife zu erhalten, in der der Schläger nicht geändert wird, nur die Befehlszeile ...
for /f tokens^=* %i in ('^<con: "my-path.bat"')do cd/d "%~i"
- Denken Sie daran, dass Schleifenvariablen
%iin bat%%i:
for /f tokens^=* %%i in ('^<con: "my-path.bat"')do cd/d "%%~i"
- Sie können Argumente (
%*) verwenden, um Ihren Befehl variabel auszuführen:
@echo off
<con: call %* "F:\path to your folder" 2>nul || echo\"F:\path to your folder"
Die 2>nulUnterdrückung eines möglichen Fehlers, und wenn der letzte Befehl nicht 0 zurückgibt, wird ein einfaches Echo ausgeführt ...
Verwenden Sie Argumente in Ihrem Schläger:
my-path.bat cd /d
Einige weiterführende Literatur:
[√] 'Cd / d'
[√] 'Für'
[√] 'Für / F'
[√] Weiterleitungen in der Fledermausdatei
[√] Bedingte Ausführung ||und&&
[√] Wie kann ich Argumente an eine Batchdatei übergeben?
[√] Start, '2> nul', 'cmd' und andere Symbole in einer Batchdatei verstehen
Warum ändern Sie nicht einfach Ihre Batch-Datei in:
@echo off
cd F:\MyPath\
Aufbauend auf der Antwort von LeRouteur könnte Folgendes ein nützlicher Kompromiss sein:
@echo off
if "%~1" == "." cd /d F:\mypath && goto :eof
echo F:\mypath
Wenn Sie nur my-pathausführen, wird der Pfad wie derzeit wiedergegeben, aber wenn Sie ausgeführt werden my-path .(dh mit einem einzelnen Punkt als Parameter), wird dieser Pfad geändert.
Wenn Sie es nicht mögen, den Pfad zweimal einzugeben, kann dies durch die Verwendung einer Umgebungsvariablen vermieden werden. Um dies jedoch "sauber" (ohne die vorhandene Umgebung zu verschmutzen) zu tun, müssen Sie ein wenig darüber nachdenken:
@echo off
setlocal
set "MYPATH=F:\mypath"
if "%~1" == "." (
endlocal && cd /d "%MYPATH%"
goto :eof
)
echo "%MYPATH%"
Die Verwendung von setlocalbedeutet, dass Änderungen an der Umgebung (z. B. MYPATH) nur lokal vorgenommen werden: endlocalWenn Sie das Ende der Batch-Datei ausführen oder erreichen, wird die ursprüngliche Umgebung wiederhergestellt (siehe setlocal /?und endlocal /?).
Die Verwendung setlocalist in Batch-Dateien sehr verbreitet, damit Umgebungsvariablen, die sie verwenden / ändern, die Hauptumgebung nicht "verschmutzen". Das Problem ist, dass das aktuelle Verzeichnis Teil der Lokalisierung ist: Wenn Sie ausgeführt werden, cdwährend setlocales in Kraft ist, kehren Sie beim Beenden des Skripts zu Ihrem Startverzeichnis zurück.
Eine Lösung besteht darin, die Befehle endlocalund cdin dieselbe Zeile zu setzen. Die Art und Weise, wie Batch-Dateien analysiert werden, bedeutet, dass die Auswertung von MYPATHerfolgt, während die Umgebung noch "lokal" ist (also immer noch den richtigen Wert hat), die Ausführung des cdBefehls (unter Verwendung des Werts, der im ersten Durchgang erhalten wurde) jedoch nicht ‚t passieren , bis nach endlocalhat ausgeführt, was bedeutet , das Verzeichnis wird geändert werden , wenn es um die Befehlszeile zurückgibt.
Die Art MYPATHund Weise, wie ich seinen Wert definiere und verwende (in doppelte Anführungszeichen eingeschlossen), ermöglicht, dass der Pfad Leerzeichen enthält. Vielleicht hier nicht notwendig, aber eine gute Angewohnheit beim Schreiben von Batch-Dateien.
Als letzte Option könnte, Sie ersetzen cd /dmit pushd. Letzterer "schiebt" das aktuelle Verzeichnis auf einen Stapel, bevor er zum neuen wechselt (siehe pushd /?). Wenn Sie mit dem, was Sie tun müssen, fertig sind, MYPATHkönnen Sie es ausführen popd, um zu dem Verzeichnis zurückzukehren, aus dem Sie ursprünglich ausgeführt haben my-path ..