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?
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?
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
(z scripts\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 (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 %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.
stm.sql
in D:\Dir1\Dir2\stm.sql
. Ich muss mysql.exe -u root -p mysql < %cd%\stm.sql
diese stm.sql-Befehle ausführen.
*.bat
oder *.sh
?
D:\Dir1\Dir2\batchfile.bat
und D:\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:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
als erste Zeile der Batch-Datei verwendet und gearbeitet
In Ihrer .bat-Datei:
set mypath=%cd%
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:
@echo %mypath%
Zum Beispiel eine Datei DIR.bat
mit dem folgenden Inhalt
set mypath=%cd%
@echo %mypath%
Pause
Beim Ausführen aus dem Verzeichnis g:\test\bat
wird dieser Pfad im DOS-Befehlsfenster wiedergegeben.
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.
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
.