Wie erhalte ich den Pfad des Batch-Skripts in Windows?

326

Ich weiß, dass %0der vollständige Pfad des Batch-Skripts enthalten ist, zc:\path\to\my\file\abc.bat

Ich würde pathgleich seinc:\path\to\my\file

Wie könnte ich das erreichen?

Mischa Moroshko
quelle
1
Übrigens:% 0 enthält nicht den vollständigen Pfad, wenn der Schläger mit einer relativen Befehlszeile aufgerufen wird. "% ~ Dpf0" wäre in diesem Fall also zuverlässiger.
eckes

Antworten:

560

%~dp0wird das Verzeichnis sein. Hier finden Sie eine Dokumentation zu allen Pfadmodifikatoren . Lustige Sachen :-)

Um den endgültigen Backslash zu entfernen, können Sie die :n,mTeilzeichenfolgensyntax wie folgt verwenden:

SET mypath=%~dp0
echo %mypath:~0,-1%

Ich glaube leider nicht, dass es eine Möglichkeit gibt, die %0Syntax mit der :~n,mSyntax zu kombinieren .

Dean Harding
quelle
7
Ausgezeichnet ... Ich habe es benutzt %~0\..- wusste, dass es einen besseren Weg geben musste! Außerdem sollten Sie wahrscheinlich %~dp0doppelte Anführungszeichen ( "") einfügen, falls der Verzeichnisname Leerzeichen enthält usw.
Cameron
1
Nett ! Aber, %~dp0enthält die `` am Ende. Haben Sie eine Idee, wie Sie es entfernen können?
Mischa Moroshko
1
@ Mischa: Ich nehme an, du meinst, wie man das '\' am Ende entfernt. Ich habe meine Antwort mit Details aktualisiert.
Dean Harding
2
Das Beispiel in der Antwort funktioniert ohne Anführungszeichen, auch wenn der Pfad ein Leerzeichen enthält. (zB SET msg=hello worldfunktioniert gut). Wenn Sie jedoch% mypath% an anderer Stelle verwenden, sollten Sie darauf achten, es in Anführungszeichen zu verwenden, obwohl sie auch nicht benötigt cdwerden.
Martin Pain
2
Dieser Link ist jetzt 404
StingyJack
12

Sie können das folgende Skript verwenden, um den Pfad abzurufen, ohne "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
duan
quelle
Dadurch wird der Dateiname jedoch nicht aus dem Pfad entfernt (z. B. abc.txt im Beispiel von OP).
DCP
4
@dcp Äh, das tut es aber.
Kyle Strand
@ Kyle Strand - Ja, ich habe es gerade noch einmal versucht und jetzt funktioniert es gut. Ich bin mir nicht sicher, was passiert ist, als ich es ursprünglich ausprobiert habe. Vielleicht habe ich irgendwo im Skript einen Fehler gemacht. Entschuldigen Sie die Verwirrung und danke, dass Sie darauf hingewiesen haben.
DCP
11

%~dp0kann ein relativer Pfad sein. Versuchen Sie Folgendes, um es in einen vollständigen Pfad umzuwandeln:

pushd %~dp0
set script_dir=%CD%
popd
Arnaud
quelle
6
Ok, warum also nicht einfach %~dp0direkt verwenden?
Jpaugh
5
Eine schlechtere Version der akzeptierten Antwort, die 5 Jahre später veröffentlicht wurde? Ich verstehe nicht
Kyle Strand
Ich stelle mir vor, dass dies gepostet wurde, um das in den Kommentaren der akzeptierten Antwort erwähnte Problem zu beheben - %~dp0kann relativ sein, was je nach Anwendungsfall ein Problem sein kann oder nicht
Michael Mrozek
10
%~dp0kann keinen relativen Pfad enthalten, dsteht für Laufwerk und pfür Pfad, wie könnte ein Laufwerk relativ sein?
Jeb
5
In welcher Welt? Ich habe diese Antwort gerade unter Windows Server 2012 r2 getestet und es stellt sich heraus %~dp0, dass sie ein absoluter Pfad ist, selbst wenn das Skript als relativer Pfad ausgeführt wurde. Dank Jebs Kommentar ließ ich mich von dieser Antwort nicht täuschen. Warum erfinden die Leute einfach Sachen und verbreiten ihre wilde Fantasie an andere. Ich habe diesen Kollegen, der das tut, aber ich habe sein (junges) Alter beschuldigt. Ich wünschte, meine Ablehnung würde zählen.
Bitoolean
0

Sie können verwenden %~dp0, d bedeutet nur das Laufwerk, p bedeutet nur den Pfad, 0 ist das Argument für den vollständigen Dateinamen der Batchdatei.

Wenn der Dateipfad beispielsweise C: \ Users \ Oliver \ Desktop \ example.bat lautet, entspricht das Argument C: \ Users \ Oliver \ Desktop \. Sie können auch den Befehl verwenden set cpath=%~dp0 && set cpath=%cpath:~0,-1%und die %cpath%Variable verwenden, um den abschließenden Schrägstrich zu entfernen.

Hayz
quelle
1
Ich kann nicht mehr Informationen sehen, als in der 9 Jahre alten Antwort
jeb
Zusätzliche Informationen sind "d bedeutet nur das Laufwerk, ..." usw. Vielen Dank, @Hayz.
RJ Dunnill
-2

%cd% gibt Ihnen den Pfad des Verzeichnisses an, in dem das Skript ausgeführt wird.

Renn einfach:

echo %cd%
Uddalak Biswas
quelle
%CD%ist der aktuelle Arbeitsordner, nicht der Ordner, in dem die Batchdatei gespeichert ist. Sie können am selben Ort sein, sind es aber oft nicht.
Stephan
-7

Das wäre die %CD%Variable.

@echo off
echo %CD%

%CD% Gibt das aktuelle Verzeichnis zurück, in dem sich das Batch-Skript befindet.

Ruel
quelle
35
% cd% gibt das Verzeichnis zurück, aus dem das Skript ausgeführt wurde, nicht das Verzeichnis, in dem sich das Skript befindet.
Misha Moroshko
4
Es funktioniert nur, wenn Ihr Skript das Arbeitsverzeichnis nicht ändert. Versuchen Sie CD C:\Temp <CR> ECHO %CD%( <CR>ist Newline ...)
Dean Harding
6
Wenn Sie mit der rechten Maustaste auf das Skript klicken und "Als Administrator ausführen" auswählen, lautet das aktuelle Startverzeichnis C: \ Windows \ System32, unabhängig davon, wo sich das Skript befindet.
Cameron
Obwohl es keine direkte Antwort auf die Frage von OP ist, ist diese Art der Funktionalität genau das, wonach ich gesucht habe, als ich diese Frage gefunden habe. Vielen Dank!
Zoltán
Keine der anderen veröffentlichten Lösungen scheint für mich unter Win7 32bit cmd.exe zu funktionieren. Dies ist zumindest für mich nützlich.
Clifford
-8

Ich arbeite auf einem Windows 7-Computer und habe am Ende die folgenden Zeilen verwendet, um den absoluten Ordnerpfad für mein Bash-Skript abzurufen.

Ich bin zu dieser Lösung gekommen, nachdem ich mir http://www.linuxjournal.com/content/bash-parameter-expansion angesehen habe .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder
Jonas
quelle
2
Das OP fragt nach Windows BAT / CMD-Shell-Skripten, nicht nach Bash.
Rivy