Startverzeichnis der Windows-Batchdatei bei 'Als Administrator ausführen'


79

Ich habe eine Batch-Datei, die sich in einem Verzeichnis befindet und auch von dort ausgeführt werden muss, da sie Dateien in diesem Verzeichnis aktualisiert.
Dies funktioniert einwandfrei, außer wenn der Benutzer die Batchdatei als Administrator ausführt (unter Vista erforderlich). Das Startverzeichnis lautet dann C: \ Windows \ System32.

Gibt es eine Möglichkeit, noch zu wissen, aus welchem ​​Verzeichnis die Batchdatei ausgeführt wurde?
Ich möchte nicht, dass der Benutzer das Verzeichnis manuell eingibt.

Antworten:


112

Versuchen Sie, wie folgt auf den Pfad der Batchdateien zuzugreifen:

echo %~dp0

Weitere Informationen finden Sie im folgenden Zitat aus dem Befehl for /?, in dem die Funktionsweise des obigen Befehls beschrieben wird:

Sie können jetzt die folgende optionale Syntax verwenden:

    % ~ I ​​- erweitert% I und entfernt alle umgebenden Anführungszeichen (")
    % ~ fI - erweitert% I zu einem vollständig qualifizierten Pfadnamen
    % ~ dI - erweitert% I nur zu einem Laufwerksbuchstaben
    % ~ pI - erweitert% I nur zu einem Pfad
    % ~ nI - erweitert% I nur auf einen Dateinamen
    % ~ xI - erweitert% I nur um eine Dateierweiterung
    % ~ sI - Der erweiterte Pfad enthält nur Kurznamen
    % ~ aI - erweitert% I auf Dateiattribute der Datei
    % ~ tI - erweitert% I auf Datum / Uhrzeit der Datei
    % ~ zI - erweitert% I auf die Dateigröße
    % ~ $ PATH: I - durchsucht die im PATH aufgelisteten Verzeichnisse
                   Umgebungsvariable und erweitert% I auf die
                   voll qualifizierter Name des ersten gefundenen.
                   Wenn der Name der Umgebungsvariablen nicht lautet
                   definiert oder die Datei wird von der nicht gefunden
                   Suche, dann erweitert sich dieser Modifikator auf die
                   leerer String

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

    % ~ dpI - erweitert% I nur auf einen Laufwerksbuchstaben und einen Pfad
    % ~ nxI - erweitert% I nur auf einen Dateinamen und eine Erweiterung
    % ~ fsI - erweitert% I zu einem vollständigen Pfadnamen mit nur kurzen Namen
    % ~ dp $ PATH: I - durchsucht die im PATH aufgelisteten Verzeichnisse
                   Umgebungsvariable für% I und erweitert sich auf die
                   Laufwerksbuchstabe und Pfad des ersten gefunden.
    % ~ ftzaI - erweitert% I zu einer DIR-ähnlichen Ausgangsleitung

Fantastisch, ich kannte diesen nicht. Vielen Dank
Marc

Wie dunkel! Aber genau das, was ich brauchte. Vielen Dank.
Stucampbell

1
@stucampbell versuchen Sie den Befehl 'für /?' um eine detaillierte Beschreibung zu erhalten, wie dies funktioniert (scrollen Sie nach unten zu Seite 4)
Martin

Donny V versuchen pushdunten
nwgat

@Donny V es funktioniert unter Windows 8.1 - ich habe es versucht. Beachten Sie, dass dies nur funktioniert, wenn Sie es in einer Batchdatei ausführen.
Martin

51

Besser als cdheißen pushddie

  • Ändern Sie den Laufwerksbuchstaben, wenn Sie mit beginnen D:\...
  • Weisen Sie einen Laufwerksbuchstaben zu, wenn Sie sich in einem UNC-Netzwerkpfad befinden

Ist pushd %~dp0also gut.

Es empfiehlt sich dann, nach Abschluss anzurufen popd.


Große Lösung für Systeme mit mehreren Volumes und Arbeiten in Windows 7, 8, 8.1 und 10, 1
Bit Fracture


1

Ich benutze:

cd% 0 ..

am Anfang der Batchdatei, um das Verzeichnis in das Verzeichnis zu ändern, in dem die Batchdatei gestartet wurde.

-Mathew


1
Das wird den Laufwerksbuchstaben nicht ändern.
Jorge Fuentes González

Dies ist eigentlich die beste Lösung, ändern Sie sie cd %0/../einfach in 👍
St3ve R0nix

0

Sie können direkt vom Dateinamen CD hinzufügen, indem Sie das übergeordnete Element hinzufügen (nicht in Windows 8.x getestet, hat aber, soweit ich mich erinnern kann, "für immer" funktioniert).

CD %FILENAME%\..

und CD wechselt auch die Laufwerke mit / D, was oben gezeigt, aber nicht explizit erwähnt wird und daher möglicherweise übersehen wird. CD / D% FILENAME% \ ..

(FOR /? IF /? SET /? CALL /? GOTO /? Alle bieten sehr nützliche Informationen, wenn Sie cmd.exe verwenden. Ich lese sie gelegentlich erneut.)


0

@setlocal enableextensions

@cd / d "% ~ dp0"


3
Syed Abdul Haseeb, ich bezweifle, dass dies hilft oder überhaupt funktioniert. Um mich davon zu überzeugen, fügen Sie bitte eine Erklärung hinzu, wie dies funktioniert und warum es hilft. Dies würde helfen, den Missverständnis zu bekämpfen, dass StackOverflow eine kostenlose Programmierserie bietet.
Yunnosch

0

Fügen Sie diese beiden Zeilen oben in Ihr .bat-Skript ein, um dieses Problem zu beheben:

@setlocal enableextensions
@cd /d "%~dp0"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.