Aktuelles Batchfile-Verzeichnis abrufen

283

Erstens habe ich dieses Thema gesehen, aber das konnte ich nicht verstehen.

Frage:

Es gibt eine Batch-Datei D:\path\to\file.batmit folgendem Inhalt:

echo %cd%
pause

Ausgabe ist:

C:\

Es muss sein D:\path\to

Was mache ich falsch?

Hamed Kamrava
quelle
7
Sie sollten alle Antworten auf eine Frage lesen, insbesondere die höheren Stimmen, nicht nur die akzeptierten. Die Antwort mit der höchsten Punktzahl auf Ihrem geposteten Link beantwortet Ihre Frage bereits.
Dbenham
4
Wenn Sie sich bei der Eingabe des Batch-Dateinamens in c: \ befinden, wird% cd% in c: \ gedruckt.
foxidrive

Antworten:

496

Die schreibgeschützte Systemvariable %CD%behält den Pfad des Aufrufers des Stapels bei, nicht den Speicherort der Stapeldatei.

Sie können den Namen des Batch-Skripts selbst abrufen, wie er vom Benutzer mit %0(z scripts\mybatch.bat. B. ) eingegeben wurde . Darauf können Parametererweiterungen angewendet %~dp0werden, die das Laufwerk und den Pfad zum Batch-Skript (z. B. W:\scripts\) und %~f0den vollständigen Pfadnamen (z W:\scripts\mybatch.cmd. B. ) zurückgeben.

Mit dieser Syntax können Sie auf andere Dateien im selben Ordner wie das Batch-Skript verweisen:

CALL %0\..\SecondBatch.cmd

Dies kann sogar in einer Unterroutine verwendet werden, Echo %0gibt die Anrufbezeichnung an, echo "%~nx0"gibt Ihnen jedoch den Dateinamen des Batch-Skripts.

Wenn die %0Variable erweitert wird, wird das Ergebnis in Anführungszeichen gesetzt.

Mehr zu Batch-Parametern .

Stoleg
quelle
1
Schauen Sie , ich brauche nicht zu laufen stm.sqlin D:\Dir1\Dir2\stm.sql. Ich muss mysql.exe -u root -p mysql < %cd%\stm.sqldiese stm.sql-Befehle ausführen.
Hamed Kamrava
@HamedKamrava ist es für meinen SQL-Batch? nicht Batch-Datei wie *.batoder *.sh?
Stoleg
@ Stoleg- In der Tat gibt es 2 Dateien in D:\Dir1\Dir2\batchfile.batund D:\Dir1\Dir2\stm.sql. Der Inhalt von batchfile.bat lautet: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlund der Inhalt von stm.sql besteht aus einigen MySQL-Befehlen.
Hamed Kamrava
1
Die schreibgeschützte Systemvariable% CD% behält den Pfad des Aufrufers des Stapels bei, nicht den Speicherort der Stapeldatei.
Stoleg
34
echo %~dp0gibt den Pfad zum Stapelspeicherort zurück. echo %~f0gibt den Pfad zum Stapel mit dem Dateinamen zurück.
Stoleg
119

Sehr einfach:

setlocal
cd /d %~dp0
File.exe
shay
quelle
9
Der Code ist kurz, aber nicht einfach zu verstehen. Was ist diese File.exe? Ist der aktuelle Verzeichnispfad in% ~ dp0 gespeichert?
Ivailo Bardarov
Diese Antwort beantwortet tatsächlich die Frage, denke ich. Ein großes Lob.
Macetw
3
Ich habe gerade cd /d %~dp0als erste Zeile der Batch-Datei verwendet und gearbeitet
mkb
warum setlocal brauchen? kommt es auch ohne gut zurück?
T.Todua
1
@ T.Todua "setlocal" bewirkt, dass Änderungen in der Umgebung, einschließlich des aktuellen Verzeichnisses, entweder bis zum Ende der Batchdatei oder bis zum Auftreten eines "endlocal" enthalten sind. Wenn Sie Umgebungsvariablen oder das aktuelle Verzeichnis ändern möchten, ist dies eine gute Form.
Jamie
30

In Ihrer .bat-Datei:

set mypath=%cd%

Sie können die Variable jetzt verwenden, %mypath%um den Dateipfad auf die .batDatei zu verweisen . So überprüfen Sie, ob der Pfad korrekt ist:

@echo %mypath%

Zum Beispiel eine Datei DIR.batmit dem folgenden Inhalt

set mypath=%cd%
@echo %mypath%
Pause

Beim Ausführen aus dem Verzeichnis g:\test\batwird dieser Pfad im DOS-Befehlsfenster wiedergegeben.

Rockerron
quelle
1
Dies ist die beste und einfachste Lösung
Nani
7
Dies ist keine gute Lösung, da das Batch-Skript, das aus einer anderen Datei auf einem anderen Pfad aufgerufen wird, nicht berücksichtigt wird.
theQuestionMan
Auch wenn% cd% als erhöhte Berechtigung ausgeführt wird, gibt es C: \ Windows \ system32 zurück, jedoch nicht das Verzeichnis, in dem es gespeichert ist.
PravyNandas
9

Folgendes verwende ich oben in allen meinen Batch-Dateien. Ich kopiere / füge es einfach aus meinem Vorlagenordner ein.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

Wenn Sie den Pfad der aktuellen Batchdatei auf% batdir% setzen, können Sie ihn in nachfolgenden stmts in der aktuellen Batchdatei aufrufen, unabhängig davon, wohin sich diese Batchdatei ändert. Mit PUSHD können Sie POPD verwenden, um den Pfad dieser Batchdatei schnell auf das ursprüngliche% batdir% festzulegen. Denken Sie daran, dass Sie bei Verwendung von% batdir% ExtraDir oder% batdir% \ ExtraDir (je nachdem, welche Version oben verwendet wurde, Backslash beenden oder nicht) die gesamte Zeichenfolge in doppelte Anführungszeichen setzen müssen, wenn der Pfad Leerzeichen enthält (dh "% batdir% ExtraDir"). ). Sie können immer PUSHD% ~ dp0 verwenden. [https: // ss64.com/ nt / syntax-args .html] enthält weitere Informationen zu (% ~) Parametern.

Beachten Sie, dass die Verwendung von (: :) am Zeilenanfang eine Kommentarzeile darstellt. Noch wichtiger ist, dass Sie mit :: Redirectors, Pipes und Sonderzeichen (dh <> | etc) in diesen Kommentar aufnehmen können.

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

Natürlich macht Powershell dies und noch viel mehr.

Wendell Holmes
quelle
2
Tolle Antwort, vielen Dank! :-) Pass auf deine zweite Technik auf ( set batdir=%CD%). Es ist nicht in Ordnung, weil es der Pfad zum Anrufer ist, nicht die Bat-Datei selbst. Der einzig gültige Weg, um den Pfad zur ausführenden Bat-Datei zu erhalten, ist %~dp0.
Mitch McMabers