Ich finde %~dp0
sehr nützlich und benutze es oft, um meine Batch-Dateien portabler zu machen.
Aber die Bezeichnung selbst erscheint mir sehr kryptisch... Was macht das ~
? Bedeutet "dp" Laufwerk und Pfad? Bezieht sich die "0" auf "%0", den Pfad zur Batch-Datei, der den Dateinamen enthält?
Oder ist es nur eine seltsame Bezeichnung?
Ich würde auch gerne wissen, ob es sich um eine dokumentierte Funktion handelt, oder um etwas, das veraltet sein könnte.
Aufruf von
for /?
in der Kommandozeile gibt Hilfe zu dieser Syntax (die auch außerhalb von FOR verwendet werden kann, dies ist nur der Ort, an dem die Hilfe zu finden ist).
Außerdem wurde die Ersetzung von FOR Variablenreferenzen verbessert worden. Sie können jetzt die folgende optionale Syntax verwenden:
%~I - expandiert %I und entfernt alle umgebenden Anführungszeichen (") %~fI - erweitert %I zu einem voll qualifizierten Pfadnamen %~dI - erweitert %I nur auf einen Laufwerksbuchstaben %~pI - erweitert %I nur zu einem Pfad %~nI - erweitert %I nur zu einem Dateinamen %~xI - erweitert %I nur um eine Dateierweiterung %~sI - der erweiterte Pfad enthält nur kurze Namen %~aI - erweitert %I um Dateiattribute der Datei %~tI - erweitert %I um Datum/Uhrzeit der Datei %~zI - erweitert %I um die Größe der Datei %~$PATH:I - durchsucht die Verzeichnisse, die in der PATH Umgebungsvariable aufgelisteten Verzeichnisse und expandiert %I in den voll qualifizierten Namen des ersten gefundenen Verzeichnisses. Falls der Name der Umgebungsvariablen nicht > definiert ist definiert ist oder die Datei bei der Suche nicht gefunden wird Suche nicht gefunden wird, wird dieser Modifikator auf die leere Zeichenkette
Die Modifikatoren können kombiniert werden, um zusammengesetzte Ergebnisse zu erhalten:
%~dpI - expandiert %I nur zu einem Laufwerksbuchstaben und Pfad %~nxI - erweitert %I nur auf einen Dateinamen und eine Erweiterung %~fsI - expandiert %I zu einem vollständigen Pfadnamen mit nur kurzen Namen %~dp$PATH:I - sucht in den Verzeichnissen, die in der PATH Umgebungsvariable aufgelisteten Verzeichnisse nach %I und expandiert auf den Laufwerksbuchstaben und Pfad des ersten gefundenen Verzeichnisses. %~ftzaI - expandiert %I zu einer DIR-ähnlichen Ausgabezeile
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 abgeschlossen. Die Wahl von Großbuchstaben Variablennamen wie %I macht es besser Lesbarkeit und vermeidet Verwechslungen mit den Modifikatoren, die nicht zwischen Groß- und Kleinschreibung unterscheiden.
Es gibt verschiedene Buchstaben, die Sie verwenden können, wie f
für "vollständiger Pfadname", d
für Laufwerksbuchstabe, p
für Pfad, und sie können kombiniert werden. %~
ist der Anfang für jede dieser Sequenzen und eine Zahl I
bedeutet, dass sie mit dem Parameter %I
arbeitet (wobei %0
der vollständige Name der Stapeldatei ist, genau wie Sie angenommen haben).
(Zunächst möchte ich Ihnen diese nützliche Referenzseite für Chargen empfehlen: http://ss64.com/nt/)
Dann eine weitere nützliche Erklärung: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/
Die Variable %~dp0
Die Variable %~dp0 (das ist eine Null), wenn sie in einer Windows Stapeldatei referenziert wird, expandiert sie zum dLaufwerksbuchstaben und pPfad dieser Stapeldatei Datei.
Die Variablen %0-%9 beziehen sich auf die Befehlszeilenparameter der Batch Datei. %1-%9 beziehen sich auf die Befehlszeilenargumente nach dem Namen der Batch-Datei. %0 bezieht sich auf die Batch-Datei selbst.
Wenn Sie dem Prozentzeichen (%) eine Tilde (~) folgen lassen, können Sie einen Modifikator (>) einfügen, können Sie vor der Parameternummer einen oder mehrere Modifikatoren einfügen, um die Art und Weise, wie die Variable expandiert wird. Der Modifikator d expandiert zum Laufwerk Laufwerksbuchstaben und der Modifikator p auf den Pfad des Parameters.
Beispiel: Nehmen wir an, Sie haben auf C: ein Verzeichnis namens bat_files, und in diesem Verzeichnis befindet sich eine Datei namens example.bat. In diesem Fall würde %~dp0 (die Kombination der Modifikatoren d und p) zu C:\bat_files\ expandieren.
Eine ausführliche Erklärung finden Sie in diesem Microsoft-Artikel.
Sehen Sie sich auch diesen Forumsbeitrag an.
Und eine deutlichere Referenz von hier:
%CmdCmdLine%
gibt die gesamte Befehlszeile zurück, wie sie an CMD.EXE übergeben wurde
%*
gibt den Rest der Befehlszeile zurück, beginnend mit dem ersten Befehlszeilenargument (in Windows NT 4 schließt %* auch alle führenden Leerzeichen ein)
%~dn
gibt den Laufwerksbuchstaben von %n (n kann von 0 bis 9 reichen) zurück, 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 nur den Dateinamen von %n zurück, wenn %n ein gültiger Dateiname ist
%~xn
gibt nur die Dateierweiterung von %n zurück, wenn %n ein gültiger Dateiname ist
%~fn
gibt den voll qualifizierten Pfad von %n zurück, wenn %n ein gültiger Dateiname oder ein Verzeichnis ist
Habe gerade eine gute Referenz für den mysteriösen Tilde-Operator ~
gefunden.
Die %~
Zeichenkette wird Prozent Tilde Operator genannt. Man findet ihn in Situationen wie: %~0
.
Die Zeichenkette :~
wird als Doppelpunkt Tilde Operator bezeichnet. Du kannst ihn in Situationen wie %SOME_VAR:~0,-1%
finden.
Die "%1-%9" beziehen sich auf die Kommandozeilen-Args. Wenn sie nicht gültige Pfadwerte sind, werden %~dp1
- %~dp9
alle zum gleichen Wert wie %~dp0
expandiert. Aber wenn sie gültige Pfadwerte sind, werden sie zu ihrem eigenen Treiber/Pfadwert expandiert.
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\
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true
Die Variable %0
in einem Batch-Skript wird auf den Namen der ausführenden Batch-Datei gesetzt. Die spezielle Syntax ~dp
zwischen %
und 0
besagt im Grunde, dass die Variable %0
erweitert werden soll, um den Laufwerksbuchstaben und den Pfad anzuzeigen, was Ihnen das aktuelle Verzeichnis mit der Batch-Datei liefert!