Erstens habe ich dieses Thema gesehen, aber das konnte ich nicht verstehen.
Frage:
Es gibt eine Batch-Datei D:\path\to\file.bat
mit folgendem Inhalt:
echo %cd%
pause
Ausgabe ist:
C:\
Es muss sein D:\path\to
Was mache ich falsch?
windows
batch-file
working-directory
Hamed Kamrava
quelle
quelle
Antworten:
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
(zscripts\mybatch.bat
. B. ) eingegeben wurde . Darauf können Parametererweiterungen angewendet%~dp0
werden, die das Laufwerk und den Pfad zum Batch-Skript (z. B.W:\scripts\
) und%~f0
den vollständigen Pfadnamen (zW:\scripts\mybatch.cmd
. B. ) zurückgeben.Mit dieser Syntax können Sie auf andere Dateien im selben Ordner wie das Batch-Skript verweisen:
Dies kann sogar in einer Unterroutine verwendet werden,
Echo %0
gibt die Anrufbezeichnung an,echo "%~nx0"
gibt Ihnen jedoch den Dateinamen des Batch-Skripts.Wenn die
%0
Variable erweitert wird, wird das Ergebnis in Anführungszeichen gesetzt.Mehr zu Batch-Parametern .
quelle
stm.sql
inD:\Dir1\Dir2\stm.sql
. Ich mussmysql.exe -u root -p mysql < %cd%\stm.sql
diese stm.sql-Befehle ausführen.*.bat
oder*.sh
?D:\Dir1\Dir2\batchfile.bat
undD:\Dir1\Dir2\stm.sql
. Der Inhalt von batchfile.bat lautet:mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
und der Inhalt von stm.sql besteht aus einigen MySQL-Befehlen.echo %~dp0
gibt den Pfad zum Stapelspeicherort zurück.echo %~f0
gibt den Pfad zum Stapel mit dem Dateinamen zurück.Sehr einfach:
quelle
cd /d %~dp0
als erste Zeile der Batch-Datei verwendet und gearbeitetIn Ihrer .bat-Datei:
Sie können die Variable jetzt verwenden,
%mypath%
um den Dateipfad auf die.bat
Datei zu verweisen . So überprüfen Sie, ob der Pfad korrekt ist:Zum Beispiel eine Datei
DIR.bat
mit dem folgenden InhaltBeim Ausführen aus dem Verzeichnis
g:\test\bat
wird dieser Pfad im DOS-Befehlsfenster wiedergegeben.quelle
Folgendes verwende ich oben in allen meinen Batch-Dateien. Ich kopiere / füge es einfach aus meinem Vorlagenordner ein.
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.
Natürlich macht Powershell dies und noch viel mehr.
quelle
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
.