Was bedeutet% ~ d0 in einer Windows-Batchdatei?

353

Ich betrachte eine Batch-Datei, die die folgenden Variablen definiert:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Was bedeutet %~d0oder %~p0eigentlich?
  • Gibt es eine Reihe bekannter Werte für Dinge wie das aktuelle Verzeichnis, das Laufwerk und die Parameter eines Skripts?
  • Gibt es andere ähnliche Verknüpfungen, die ich verwenden könnte?
Chris Smith
quelle

Antworten:

539

Die magischen Variablen %n enthalten die Argumente, die zum Aufrufen der Datei verwendet werden: Ist der %0Pfad zur Bat-Datei selbst, %1ist das erste Argument danach, %2ist das zweite und so weiter.

Da es sich bei den Argumenten häufig um Dateipfade handelt, gibt es eine zusätzliche Syntax zum Extrahieren von Teilen des Pfads. ~dist Laufwerk, ~pist der Pfad (ohne Laufwerk), ~nist der Dateiname. Sie können kombiniert werden, ebenso ~dpwie Laufwerk + Pfad.

%~dp0 ist daher in einer Fledermaus ziemlich nützlich: Es ist der Ordner, in dem sich die ausführende Fledermausdatei befindet.

Sie können auch andere Arten von Metainformationen über die Datei ~tabrufen : Ist der Zeitstempel, ~zist die Größe.

Schauen Sie hier für eine Referenz für alle Kommandozeilenbefehle. Die Tilde-Magic-Codes sind unter für beschrieben .

JacquesB
quelle
15
Hinweis für sich selbst: Funktioniert echo %~dp0nicht in der Befehlszeile, sondern nur in einer Batchdatei. Duh!
Northben
2
Gibt es einen Unterschied zwischen %~d0und %~d0%?
Geoffrey
2
@Pacerier:% 0 ist der vollständige Pfad einschließlich des Dateinamens des Skripts. % ~ dp0 ist der Pfad zu dem Ordner, der das Skript enthält, jedoch den Dateinamen des Skripts ausschließt.
JacquesB
4
Hinweis für sich selbst: echo %~pd0Gibt die gleiche Ausgabe wie Echo %~dp0(statt wie erwartet invers). Der Wert von %0ist unterschiedlich, je nachdem, ob Sie auf die Batchdatei doppelklicken oder sie über cmd ausführen.
Pacerier
152

Sie sind erweiterte Variablensubstitutionen. Sie ändern die in Batch-Dateien verwendeten% N-Variablen. Sehr nützlich, wenn Sie sich mit Batch-Programmierung in Windows beschäftigen.

%~I         - expands %I removing any surrounding quotes ("")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Sie können die oben genannten finden, indem Sie ausführen FOR /?.

efotinis
quelle
48

Ja, es gibt andere Verknüpfungen, die Sie verwenden können. In Ihrem Befehl würde ~ d0 den Laufwerksbuchstaben des 0. Arguments bedeuten.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Da das 0. Argument der Skriptpfad ist, erhält es den Laufwerksbuchstaben des Pfads für Sie. Sie können auch die folgenden Verknüpfungen verwenden.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Dies finden Sie auch direkt in der Eingabeaufforderung, wenn Sie CALL /? oder für /?

Clewaks
quelle
9

Ein weiterer Tipp, der sehr hilfreich wäre, ist, dass man dann zuerst das aktuelle Verzeichnis auf ein anderes Laufwerk setzen %~d0muss cd %~dp0. Dadurch wird das Verzeichnis in das Laufwerk der Batchdatei und anschließend in den Ordner geändert.

Ändert für #oneLinerLovers cd /d %~dp0sowohl das Laufwerk als auch das Verzeichnis :)

Hoffe das hilft jemandem.

Marvin Thobejane
quelle
7
Eine andere Option ist pushd %~dp0, dass das aktuelle Laufwerk problemlos geändert werden kann und Sie den zusätzlichen Vorteil haben, dass Sie popdspäter zum ursprünglichen Laufwerk / Pfad zurückkehren können.
bcrist
7

%~d0gibt Ihnen den Laufwerksbuchstaben des Arguments 0 (den Skriptnamen), %~p0den Pfad.

Armin Ronacher
quelle
6

Einige Fallstricke, auf die Sie achten sollten:

Wenn Sie doppelklicken, wird die Batchdatei %0von Anführungszeichen umgeben. Wenn Sie diese Datei beispielsweise speichern als c:\test.bat:

@echo %0
@pause

Durch Doppelklicken wird eine neue Eingabeaufforderung mit Ausgabe geöffnet:

"C:\test.bat"

Wenn Sie jedoch zuerst eine Eingabeaufforderung öffnen und direkt von dieser Eingabeaufforderung aus aufrufen, %0wird auf alles verwiesen, was Sie eingegeben haben . Wenn Sie eingeben test.batEnter, enthält die Ausgabe von %0keine Anführungszeichen, da Sie keine Anführungszeichen eingegeben haben:

c:\>test.bat
test.bat

Wenn Sie eingeben testEnter, hat die Ausgabe von %0auch keine Erweiterung, da Sie keine Erweiterung eingegeben haben:

c:\>test
test

Gleiches gilt für tEsTEnter:

c:\>tEsT
tEsT

Wenn Sie eingeben "test"Enter, enthält die Ausgabe von %0Anführungszeichen (da Sie sie eingegeben haben), jedoch keine Erweiterung:

c:\>"test"
"test"

Wenn Sie schließlich eingeben "C:\test.bat", ist die Ausgabe genau so, als hätten Sie darauf doppelklicken:

c:\>"C:\test.bat"
"C:\test.bat"

Beachten Sie, dass dies nicht alle möglichen Werte sein %0können, da Sie das Skript aus anderen Ordnern aufrufen können:

c:\some_folder>/../teST.bAt
/../teST.bAt

Alle oben gezeigten Beispiele wirken sich auch aus %~0, da die Ausgabe von %~0einfach die Ausgabe von %0 Minus-Anführungszeichen (falls vorhanden) ist.

Pacerier
quelle
3

Dieser Code erklärt die Verwendung des ~ tilda-Zeichens, was für mich am verwirrendsten war. Sobald ich das verstanden habe, ist es viel einfacher zu verstehen:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
Djangofan
quelle
1

Es zeigt den aktuellen Speicherort der Datei oder des Verzeichnisses an, in dem Sie sich gerade befinden. Wenn sich Ihre Batchdatei im Desktop-Verzeichnis befindet, zeigt "% ~ dp0" das Desktop-Verzeichnis an. Wenn Sie möchten, dass das aktuelle Verzeichnis mit dem aktuellen Dateinamen angezeigt wird, können Sie "% ~ dp0% ~ n0% ~ x0" eingeben.

zask
quelle
"% ~ dpnx0" wäre besser
FrinkTheBrave