Befehlszeile .cmd / .bat-Skript, wie das Verzeichnis des laufenden Skripts abgerufen wird

Antworten:

57

Raymond Chen hat einige Ideen:

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

Hier vollständig zitiert, da MSDN-Archive in der Regel etwas unzuverlässig sind:

Der einfache Weg ist die Verwendung der %CD%Pseudovariablen. Es wird in das aktuelle Arbeitsverzeichnis erweitert.

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(Natürlich Verzeichnis speichern / wiederherstellen könnte leichter gemacht habe mit pushd/ popd, aber das ist nicht der Punkt hier.)

Der %CD%Trick ist sogar über die Befehlszeile praktisch. Zum Beispiel befinde ich mich oft in einem Verzeichnis, in dem es eine Datei gibt, mit der ich arbeiten möchte, aber ... oh, ich muss in ein anderes Verzeichnis wechseln, um diesen Vorgang auszuführen.

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(Ich verwende es gerne %_%als meine Scratch-Umgebungsvariable.)

Geben Sie ein SET /?, um die anderen vom Befehlsprozessor bereitgestellten Pseudovariablen anzuzeigen.

Auch die Kommentare im Artikel sind es wert, gescannt zu werden, zum Beispiel dieser (über die WayBack-Maschine, da Kommentare aus älteren Artikeln verschwunden sind):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

Dies umfasst die Verwendung von% ~ dp0:

Wenn Sie wissen möchten, wo sich die Batchdatei befindet: %~dp0

%0ist der Name der Batchdatei. ~dpgibt Ihnen das Laufwerk und den Pfad des angegebenen Arguments an.

Kev
quelle
13
Dies beantwortet die Frage nicht. % CD% gibt das aktuelle Verzeichnis an, während gefragt wurde, welches Verzeichnis das Skript enthält.
Ketorin
3
@ketorin: Diese DOES die Frage beantworten. % CD% ändert sich, wenn das Skript selbst während seiner Verwendung das Verzeichnis wechselt (pushd / cd / ..), % ~ dp0 sich jedoch NICHT ändert und immer darauf verweist , wo sich das Skript befindet.
Jay
-1 Ich kann nicht sagen, ob dies die Frage beantwortet oder nicht. Können Sie mir ein Beispiel zeigen?
Iain Samuel McLean Elder
1
@IainElder - Sie haben wahrscheinlich Recht, ich habe diese Antwort vor ein paar Tagen erneut besucht und war nicht sehr zufrieden damit. Die Kommentare in Raymond Chens Blog, auf die ich mich beziehe, scheinen von MS geblitzt worden zu sein - darin liegen also die Gefahren von Antworten, die ausschließlich auf verknüpften externen Quellen beruhen. Ich habe versucht, ein anderes Material zu finden, um meine Antwort zu stützen, aber es ist so lange her, dass es jetzt im Nebel der Zeit ist. Zum Löschen markieren. Vielen Dank, dass Sie mir mit diesem einen Tipp gegeben haben :) Sie arbeiten nicht zufällig für SkyScanner, oder?
Kev
1
@Kev Es ist in Ordnung, auf externe Quellen zu verweisen, wenn Sie den hilfreichen Teil in Stack Overflow kopieren. Ich denke jetzt ist es zu spät! Und ja, es ist bekannt, dass ich im Skyscanner-Rechenzentrum lauere ;-)
Iain Samuel McLean Elder
146

Dies entspricht dem Pfad des Skripts:

%~dp0

Dies verwendet die Syntax der Stapelparametererweiterung. Parameter 0 ist immer das Skript selbst.

Wenn Ihr Skript unter gespeichert ist C:\example\script.bat, wird es %~dp0ausgewertet C:\example\.

ss64.com enthält weitere Informationen zur Syntax der Parametererweiterung. Hier ist der relevante Auszug:

Sie können den Wert jedes Parameters mit einem% abrufen, gefolgt von seiner numerischen Position in der Befehlszeile.

[...]

Wenn ein Parameter zur Angabe eines Dateinamens verwendet wird, kann die folgende erweiterte Syntax angewendet werden:

[...]

% ~ d1 Erweitern Sie% 1 nur auf einen Laufwerksbuchstaben - C:

[...]

% ~ p1 Erweitern Sie% 1 nur auf einen Pfad, z. B. \ utils \, einschließlich eines nachgestellten \, der von einigen Befehlen als Escape-Zeichen interpretiert werden kann.

[...]

Die oben genannten Modifikatoren können kombiniert werden:

% ~ dp1 Erweitern Sie% 1 nur auf einen Laufwerksbuchstaben und einen Pfad

[...]

Sie können den Pfadnamen des Batch-Skripts selbst mit% 0 abrufen. Parametererweiterungen können darauf angewendet werden, sodass% ~ dp0 das Laufwerk und den Pfad zum Batch-Skript zurückgibt, z. B. W: \ scripts \

Landon
quelle
Genau das, was ich brauchte. Und ich habe diese Antwort zur Erinnerung an meinen Blog verlinkt :)
Olivier H
Ich bin mir nicht sicher, ob es sich um einen Fehler im zitierten Text handelt, aber in meinem Skript benötige ich "% ~ d0", um den Laufwerksbuchstaben zu erhalten! % ~ d1 ist in meinem Fall leer.
fklappan
In meinen Augen / meiner Situation ist dies der akzeptierten Antwort überlegen. Wenn Sie ein Befehlszeilenskript "als Administrator" ausführen (Rechtsklick darauf), wird Ihr Skript unter Windows \ system32 ausgeführt. Die akzeptierte Antwort gibt Ihnen NICHT den Speicherort des Skripts, sondern erneut Windows \ system32. Dh DIESE Antwort hilft Ihnen, das zu beheben. Sie starten Ihr Skript mit cd% ~ dp0
Jaroslav Záruba
0
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d

pushd %curdir%

Quelle

Alex. S.
quelle
Nicht genügend Dokumentation oder Begründung.
BenPen