Was bedeutet% ~ dp0 und wie funktioniert es?

1024

Ich finde es %~dp0sehr nützlich und verwende es häufig, um meine Batch-Dateien portabler zu machen.

Aber das Label selbst scheint mir sehr kryptisch ... Was macht das ~? Bedeutet dpFahrt und Weg? Bezieht sich das 0auf %0den Pfad zur Batch-Datei, die den Dateinamen enthält?

Oder ist es nur ein komisches Label?

Ich würde auch gerne wissen, ob es sich um eine dokumentierte Funktion handelt oder um etwas, das veraltet ist.

Sebastián Grignoli
quelle
13
Mögliches Duplikat von Was bedeutet% ~ d0 in einer Windows-Batchdatei?
Helen
2
Du hast recht, Hellen. Diese Frage tauchte nicht auf, als ich nach% ~ dp0 suchte. Vielleicht, weil der Titel% ~ d0 anstelle von% ~ dp0 enthält.
Sebastián Grignoli
9
SymbolHound eignet sich hervorragend für die Suche nach anderen als alphanumerischen Zeichen. Suchen Sie zum%~dp0 Beispiel nach . Normalerweise finde ich, dass sich die Top-Hits auf Inhalte auf SO beziehen.
DavidRR
SymbolHound funktionierte bei mir nicht mit der Suche symbolhound.com/?q=%25~dp0 . Dies funktionierte jedoch: google.com/search?q=%25~dp0 - sag nur ...
Kristopher
1
SymbolHound 2019: Funktioniert nicht und uMatrix gibt an, dass eine Verbindung zu Websites von Drittanbietern wie blockchain.info und paypalobjects.com hergestellt wird.
Nils Lindemann

Antworten:

811

Berufung

for /?

In der Befehlszeile finden Sie Hilfe zu dieser Syntax (die auch außerhalb von FOR verwendet werden kann. Dies ist nur der Ort, an dem Hilfe gefunden werden kann).

Darüber hinaus wurde die Ersetzung von FOR-Variablenreferenzen verbessert. Sie können jetzt die folgende optionale Syntax verwenden:

%~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

Die Modifikatoren können kombiniert werden, um zusammengesetzte Ergebnisse zu erhalten:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

In den obigen Beispielen können% I und PATH durch andere gültige Werte ersetzt werden. Die% ~ -Syntax wird durch einen gültigen FOR-Variablennamen beendet. Durch die Auswahl von Variablennamen in Großbuchstaben wie% I wird die Lesbarkeit verbessert und Verwechslungen mit den Modifikatoren vermieden, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird.

Es gibt verschiedene Buchstaben, die Sie wie ffür "vollständiger Pfadname", dfür Laufwerksbuchstaben, pfür Pfad verwenden können, und sie können kombiniert werden. %~ist der Anfang für jede dieser Sequenzen und eine Zahl gibt an, dass Isie für den Parameter funktioniert %I(wobei %0der vollständige Name der Batchdatei ist, genau wie Sie angenommen haben).

Schnaader
quelle
2
Ich kenne niemanden anders, aber ich erhalte die Meldung "Die folgende Verwendung des Pfadoperators bei der Ersetzung von Stapelparametern ist ungültig. Geben Sie für gültige Formate CALL /? Oder FOR /? Ein. Die Syntax des Befehls ist falsch." bei der Verwendung I. Ich muss 0statt verwenden I. Ich weiß nicht, ob ich etwas verpasst habe oder was auch immer, aber ich lasse die Leute nur wissen.
Mythosofechelon
71
@BenHooper Iist ein Platzhalter für den Variablenindex. 0= die aufrufende Datei, 1= Argument # 1, 2= Argument # 2, etc ...
Chris
9
Diese Antwort ist gut. Und erschöpfend. Für ein bisschen mehr Kürze mag ich die Antwort auf diese fast
Frank Nocke
1
Diese Antwort ist etwas verwirrend, da diese Substitutionen außerhalb von FOR verwendet werden können.
David
347

(Zunächst möchte ich diese nützliche Referenzseite für Batch empfehlen: http://ss64.com/nt/ )

Dann noch eine nützliche Erklärung: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

Die% ~ dp0-Variable

Das% ~ dp0 (das ist eine Null) Variable , wenn innerhalb einer Windows - Batch - Datei verwiesen wird auf den erweitert d rive Brief und p ath diese Batch - Datei.

Die Variablen% 0-% 9 beziehen sich auf die Befehlszeilenparameter der Batchdatei. % 1-% 9 beziehen sich auf Befehlszeilenargumente nach dem Namen der Batchdatei. % 0 bezieht sich auf die Batchdatei selbst.

Wenn Sie dem Prozentzeichen (%) ein Tildezeichen (~) folgen, können Sie vor der Parameternummer einen oder mehrere Modifikatoren einfügen, um die Art und Weise zu ändern, in der die Variable erweitert wird. Der Modifikator d wird zum Laufwerksbuchstaben und der Modifikator p zum Pfad des Parameters erweitert.

Beispiel: Angenommen, Sie haben ein Verzeichnis in C: mit dem Namen bat_files und in diesem Verzeichnis befindet sich eine Datei mit dem Namen example.bat. In diesem Fall wird% ~ dp0 (Kombination der Modifikatoren d und p) zu C: \ bat_files erweitert.

In diesem Microsoft-Artikel finden Sie eine vollständige Erklärung.

Schauen Sie sich auch diesen Forenthread an .

Und eine klarere Referenz von hier :

  • %CmdCmdLine% gibt die gesamte Befehlszeile zurück, die an CMD.EXE übergeben wurde

  • %* gibt den Rest der Befehlszeile ab dem ersten Befehlszeilenargument zurück (in Windows NT 4 enthält% * auch alle führenden Leerzeichen).

  • %~dn gibt den Laufwerksbuchstaben von% n zurück (n kann zwischen 0 und 9 liegen), wenn% n ein gültiger Pfad oder Dateiname ist (kein UNC)

  • %~pn gibt das Verzeichnis von% n zurück, wenn% n ein gültiger Pfad oder Dateiname ist (kein UNC)

  • %~nn gibt den Dateinamen nur von% n zurück, wenn% n ein gültiger Dateiname ist

  • %~xn gibt die Dateierweiterung von% n nur zurück, wenn% n ein gültiger Dateiname ist

  • %~fn gibt den vollständig qualifizierten Pfad von% n zurück, wenn% n ein gültiger Dateiname oder ein gültiges Verzeichnis ist

ADD 1

Ich habe gerade eine gute Referenz für den mysteriösen ~ Tilde-Operator gefunden.

Die %~Zeichenfolge wird als Prozent-Tilde- Operator bezeichnet. Sie finden es in Situationen wie : %~0.

Die :~Zeichenfolge wird als Doppelpunkt-Tilde- Operator bezeichnet. Sie können es wie finden %SOME_VAR:~0,-1%.

ADD 2 - 1:12 PM 7/6/2018

%1-%9Weitere Informationen finden Sie in den Befehlszeilenargumenten. Wenn es sich nicht um gültige Pfadwerte handelt, werden %~dp1- %~dp9alle auf denselben Wert wie erweitert %~dp0. Wenn es sich jedoch um gültige Pfadwerte handelt, werden sie auf ihren eigenen Treiber- / Pfadwert erweitert.

Zum Beispiel: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Lauf 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Lauf 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
smwikipedia
quelle
Auch neugierig auf dieses Konzept und fand hier die gute Klarstellung. Danke Mingge. ^ _ ^
Eugene
1
für mich erweitert es sich auf c: \ bat_files \ (mit Trailing Path Separator)
Santa
Die Links zum Microsoft-Artikel und zum
Forenthread
151

Die Variable %0in einem Batch-Skript wird auf den Namen der ausführenden Batch-Datei gesetzt.

Die ~dpspezielle Syntax zwischen dem %und dem 0besagt im Grunde, dass die Variable erweitert werden soll %0, um den Laufwerksbuchstaben und den Pfad anzuzeigen, wodurch Sie das aktuelle Verzeichnis erhalten, das die Batchdatei enthält!

Hilfe = Link

Andy White
quelle
@Andy, gibt es eine Möglichkeit, %0direkt im cmd zu testen, ohne eine .bat-Datei auf der lokalen Festplatte zu speichern?
Pacerier
Der Link ist defekt und ich kann den richtigen Link nicht finden. Bei einer ausstehenden Bearbeitung ist der Link weiterhin fehlerhaft.
George_E
44

% ~ dp0 wird zum aktuellen Verzeichnispfad der laufenden Batchdatei erweitert.

Um ein klares Verständnis zu erhalten, erstellen wir eine Batchdatei in einem Verzeichnis.

C: \ script \ test.bat

mit Inhalt:

@echo off
echo %~dp0

Wenn Sie es an der Eingabeaufforderung ausführen, wird folgendes Ergebnis angezeigt:

C: \ script \

Null
quelle
41

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.

Alternativ wird für #oneLinerLovers, wie @Omni in den Kommentaren hervorhob, cd /d %~dp0sowohl das Laufwerk als auch das Verzeichnis geändert :)

Hoffe das hilft jemandem.

Marvin Thobejane
quelle
23
cdhat einen eingebauten Parameter, der sowohl das Laufwerk als auch den Ordner wechselt:cd /d %~dp0
OmnipotentEntity
2
Sie haben Recht und das /dArgument ist hilfreich, aber es verdient, als alternative Antwort für einen Kandidaten und nicht als Kommentar zu dieser Antwort veröffentlicht zu werden. Vielen Dank für den Hinweis, ich wusste nichts davon :)
Marvin Thobejane
4
Sie können auch '' pushd% ~ dp0 '' verwenden, um Laufwerk und Ordner zu wechseln
fmuecke
25

Tolles Beispiel aus dem tragbaren Shell Launcher von Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

Ich bin mir nicht sicher, was die negative 1 dort selbst macht, aber es ist ein Vergnügen!

HansBKK
quelle
11
+1 sehr nützlich. Die if-Anweisung prüft, ob ein Backslash vorhanden ist, und entfernt den Backslash gegebenenfalls. Die negative 1 in der Bedingung extrahiert das letzte Zeichen, und der Ausdruck in der set-Anweisung verwendet die Pfadzeichenfolge abzüglich des letzten Zeichens (das der Backslash ist).
Matt
1
negative 1 ist minus das letzte Zeichen. Lesen Sie variable
Teilzeichenfolge
12

Ein Beispiel wäre schön - hier ist ein triviales

for %I in (*.*) do @echo %~xI

Es werden nur die ERWEITERUNGEN jeder Datei im aktuellen Ordner aufgelistet

Für nützlichere Variablenkombinationen (auch in der vorherigen Antwort aufgeführt) über die CMD-Eingabeaufforderung führen Sie Folgendes aus: HELP FOR Dieses Snippet enthält

Die Modifikatoren können kombiniert werden, um zusammengesetzte Ergebnisse zu erhalten:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line
Administrator
quelle
Ich bekam "~ xIch war zu diesem Zeitpunkt unerwartet." Probieren Sie das Beispiel aus - liegt es daran, dass ich Win 7 verwende?
Kapitel
Dies sind gute Informationen, die jedoch den ursprünglichen Beitrag nicht adressieren.
De Shan Baptiste