Wie finde ich das aktuelle Verzeichnis einer Batchdatei und verwende es dann für den Pfad?

70

Ich habe eine Batch-Datei, die ich an unsere Kunden verteilen möchte, um eine Softwareaufgabe auszuführen.

Wir verteilen sie als Ordner oder .zipmit den darin enthaltenen Dateien. Im Inneren befinden sich die Batch-Dateien und ein weiterer Ordner mit den Dateien, die zum Ausführen des Batches benötigt werden.

Normalerweise geben Sie beim Erstellen eines Stapels den Pfad ein, in dem sich die Dateien befinden. Aber ich werde nicht wissen, wo die Dateien sind. Die Dateien werden weiterhin im Hauptordner gespeichert, aber der Stapel muss diesen Ordner finden, damit die Dateien ausgeführt werden können.

Zum Beispiel: Wenn sie den Hauptordner auf dem Desktop haben und ihn ausführen, müsste es so etwas wie "C:\Users\Username\Desktop"eine Ausführung sein. Sie hätten die Batch-CD an diesem Ort.

Aber was ist, wenn sie es aus Dokumenten ausführen? Ich kenne den Benutzernamen nicht, also muss ich den Stapel irgendwie finden lassen. Jeder Code und / oder jede Anleitung wäre großartig.

Ryan Barber
quelle
Es liegt an Ihnen, Ihr Problem genauer zu beschreiben. Ich kann deinen Standpunkt nicht verstehen.
Endoro
1
Vergiss meine letzte Frage (ist möglicherweise nicht sichtbar, weil ich sie gelöscht habe. Ich habe es herausgefunden. Ich musste der Zeile ein "/ s" hinzufügen
Ryan Barber

Antworten:

87

Sie müssen nicht wissen, wo sich die Dateien befinden, denn wenn Sie eine Bat-Datei starten, ist das Arbeitsverzeichnis das Verzeichnis, in dem sie gestartet wurde (der "Hauptordner"). Wenn Sie also diese Struktur haben:

.\mydocuments\folder\mybat.bat
.\mydocuments\folder\subfolder\file.txt

Und der Benutzer startet die Datei "mybat.bat". Das Arbeitsverzeichnis lautet ". \ Mydocuments \ folder". Sie müssen also nur den Namen des Unterordners in Ihr Skript schreiben:

@Echo OFF
REM Do anything with ".\Subfolder\File1.txt"
PUSHD ".\Subfolder"
Type "File1.txt"
Pause&Exit

Auf jeden Fall wird das Arbeitsverzeichnis in der Variablen "% CD%" gespeichert, und das Verzeichnis, in dem die Fledermaus gestartet wurde, wird im Argument 0 gespeichert. Wenn Sie das Arbeitsverzeichnis auf einem beliebigen Computer kennen möchten, können Sie Folgendes tun:

@Echo OFF
Echo Launch dir: "%~dp0"
Echo Current dir: "%CD%"
Pause&Exit
ElektroStudios
quelle
29
Das ist falsch. Das Starten einer bat-Datei ändert nichts am Arbeitsverzeichnis. Dies funktioniert garantiert nur, wenn Sie ein Befehlsfenster öffnen, das aktuelle Verzeichnis in das des Batch-Skripts ändern und es dann durch Eingabe seines Namens starten. Eine Alternative, die nicht funktioniert, ist die Eingabe von "CD C: \ Temp" und dann "C: \ Scripts \ MyScript.bat". Dadurch wird MyScript gestartet, aber das Arbeitsverzeichnis wird NICHT das Startverzeichnis sein. In ähnlicher Weise ändert das Starten von Batch-Skripten über den Windows Explorer das Arbeitsverzeichnis nicht automatisch.
Weihnachten
2
Unterhaltsame Tatsache: Wenn Sie ein Batch-Skript schreiben, um eine Reihe von Build-DLLs zu löschen, und es dann im Explorer ausführen, wird es im aktuellen Verzeichnis als Datei ausgeführt. Wenn Sie die Build-DLLs jedoch nicht löschen können, weil "Zugriff verweigert" ist und Sie versuchen, das Batch-Skript vom Explorer als Administrator auszuführen, wird es in C: \ Windows \ System32 ausgeführt. Und dann löschen Sie die DLLs.
Sorensen
62

Die Antwort von ElektroStudios ist etwas irreführend.

"Wenn Sie eine Bat-Datei starten, ist das Arbeitsverzeichnis das Verzeichnis, in dem sie gestartet wurde." Dies gilt, wenn der Benutzer im Explorer auf die Batch-Datei klickt.

Wenn das Skript jedoch mit dem Befehl CALL von einem anderen Skript aus aufgerufen wird, ändert sich das aktuelle Arbeitsverzeichnis nicht.

Daher ist es in Ihrem Skript besser,% ~ dp0subfolder \ file1.txt zu verwenden

Bitte beachten Sie auch, dass% ~ dp0 mit einem Backslash endet, wenn sich das aktuelle Skript nicht im aktuellen Arbeitsverzeichnis befindet. Wenn Sie also den Verzeichnisnamen ohne nachgestellten Backslash benötigen, können Sie so etwas wie verwenden

call :GET_THIS_DIR
echo I am here: %THIS_DIR%
goto :EOF

:GET_THIS_DIR
pushd %~dp0
set THIS_DIR=%CD%
popd
goto :EOF
Henning
quelle
Ich hatte auch immer den Eindruck, dass sich das "Arbeitsverzeichnis" dort befindet, wo sich die .bat-Datei befindet, wenn Sie es ausführen. Ich habe heute herausgefunden, dass das einfach nicht stimmt. Auf einem neuen PC stellte ich fest, dass ein einfacher Befehl "dir" in einer Bat-Datei nicht das Verzeichnis anzeigt, in dem sich die Bat-Datei befindet, sondern ein anderes Verzeichnis. Die Verwendung der pushd-Anweisung hier hat dieses Problem zuerst behoben. Vielen Dank!
Travis Laborde
46

Sie können auch tun

 Pushd "%~dp0"

Das berücksichtigt auch das Laufen von einem unbekannten Pfad.

Matt Williamson
quelle
1
Dies funktionierte für mich, als die Fledermaus als Administrator gestartet wurde
Marco Rinaldi
8

Versuchen Sie es in Ihrem Stapel

set "batchisin=%~dp0"

Dadurch sollte die Variable auf den Speicherort Ihres Stapels festgelegt werden.

Magoo
quelle
danke für all deine Hilfe. Aber keines davon hat funktioniert. Mein Hauptstapel ist mit anderen Stapeln unter demselben Hauptordner verknüpft, jedoch in einem Unterordner. Wenn ich die Nummer im Menü des Hauptstapels eingebe, können die BVT in den Unterordnern nicht gestartet werden.
Ryan Barber