2008-09-24 2 views

Antwort

53

Raymond Chen hat ein paar Ideen:

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

hier Zitiert in voller weil MSDN Archive sind in der Regel etwas unzuverlässig sein:

Der einfache Weg, die zu benutzen ist %CD% Pseudovariable. Es erweitert sich um das aktuelle Arbeitsverzeichnis .

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

(Natürlich Verzeichnis/save leichter mit pushd/popd gemacht wurde wieder herstellen könnte, aber das ist nicht der Punkt hier.)

Der %CD% Trick ist praktisch sogar von der Kommandozeile aus. Zum Beispiel, I oft finde ich mich in einem Verzeichnis, in dem es eine Datei gibt, die ich operieren möchte, aber ... oh, ich muss Chdir zu einem anderen Verzeichnis in der Reihenfolge , um diesen Vorgang durchzuführen.

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

(Ich mag %_% als meine scratch Umgebungsvariable verwenden.)

Typ SET /? die anderen pseudo-Variablen durch den Befehl Prozessor zu sehen.

auch die Kommentare in dem Artikel wert sind Scannen zum Beispiel diese:

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

dies die Verwendung von% deckt ~ dp0:

Wenn Sie möchten wissen, wo die Batch-Datei lebt: %~dp0

%0 ist der Name der Stapeldatei. ~dp gibt Ihnen das Laufwerk und den Pfad von das angegebene Argument.

+12

Dies beantwortet die Frage nicht. % CD% gibt das aktuelle Verzeichnis an, während das Verzeichnis des Skripts gefragt wurde. – ketorin

+3

** @ Ketorin: ** Dies ** beantwortet ** die Frage. % CD% wird sich ändern, wenn das Skript selbst das Verzeichnis während seiner Verwendung ändert (pushd/cd/..), aber **% ~ dp0 ** wird ** NOT ** ändern und immer auf den Ort zeigen, an dem sich das Skript befindet. – Jay

+0

-1 Ich kann nicht sagen, ob das die Frage beantwortet oder nicht. Kannst du mir ein Beispiel zeigen? –

135

Dieser auf den Pfad des Skripts äquivalent:

%~dp0 

Dies verwendet die Batch-Parameter Erweiterung Syntax. Parameter 0 ist immer das Skript selbst.

Wenn Ihr Skript unter C:\example\script.bat gespeichert ist, wird %~dp0 als C:\example\ ausgewertet.

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

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

[...]

Wenn ein Parameter einen Dateinamen zu liefern, dann kann die folgende erweiterte Syntax angewandt werden verwendet:

[...]

% ~ d1 Expandieren% 1 nur zu einem Laufwerksbuchstabe - C:

[...]

% ~ p1% erweitert 1 auf einen Pfad nur zB \ utils \ Dies beinhaltet ein abschließendes \, das von einigen Befehlen als Escape-Zeichen interpretiert werden kann.

[...]

Die Modifikatoren oben können kombiniert werden:

% ~ DP1% erweitern 1 einen Laufwerkbuchstaben und Pfad von

[...]

Sie können den Pfadnamen des Batch-Skripts selbst mit% 0 abrufen, Parametererweiterungen können auf diesen Parameter angewendet werden, so dass% ~ dp0 das Laufwerk und den Pfad zum Batch-Skript zurückgibt, z W: \ Scripts \

+0

Genau das, was ich brauchte. Und ich verlinkte diese anwser zu meinem Blog, als Erinnerung :) –

+0

Nicht sicher, ob es ein Fehler/Fehler im zitierten Text ist, aber in meinem Skript brauche ich "% ~ d0", um den Laufwerksbuchstaben zu erhalten! % ~ d1 ist in meinem Fall leer. – eftokay83

+0

In meinen Augen/Situation ist dies der akzeptierten Antwort überlegen.Wenn Sie ein Befehlszeilenskript "als Administrator" ausführen (Rechtsklick darauf), wird Ihr Skript von Windows \ system32 ausgeführt. Die angenommene Antwort gibt Ihnen NICHT den Speicherort des Skripts, es gibt Ihnen wieder Windows \ system32. I.e. Diese Antwort hilft Ihnen, das Problem zu beheben. Sie starten Ihr Skript mit cd% ~ dp0 –

1
for /F "eol= delims=~" %%d in ('CD') do set curdir=%%d 

pushd %curdir% 

Source

Verwandte Themen