2008-09-24 7 views

Répondre

53

Raymond Chen a quelques idées:

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

Cité ici dans son intégralité, car les archives MSDN ont tendance à être peu fiables:

Le plus simple est d'utiliser la %CD% pseudo-variable. Il se développe au répertoire de travail actuel .

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

(Bien sûr, répertoire de sauvegarde/restauration pourrait plus facilement avoir été fait avec pushd/popd, mais ce n'est pas le point ici.)

L'astuce %CD% est pratique même à partir de la ligne de commande. Par exemple, je souvent me trouver dans un répertoire où il ya un fichier que je veux fonctionner mais ... oh, je dois chdir à un autre répertoire dans l'ordre pour effectuer cette opération.

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

(J'aime utiliser %_% comme ma variable d'environnement zéro.)

type SET /? pour voir les autres pseudo-variables fournies par la commande processeur.

également les commentaires dans l'article valent bien le balayage par exemple celui-ci:

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

Cela couvre l'utilisation de% ~ dp0:

Si vous voulez savoir où vit le fichier batch: %~dp0

%0 est le nom du fichier de traitement par lots. ~dp vous donne le lecteur et le chemin de l'argument spécifié.

+12

Cela ne répond pas à la question. % CD% donne le répertoire courant, alors que ce qui a été demandé était le répertoire du script. – ketorin

+3

** @ ketorin: ** Ceci ** répond ** à la question. % CD% changera si le script change de répertoire tout au long de son utilisation (pushd/cd/..) mais **% ~ dp0 ** ** NE changera PAS et pointera toujours vers l'emplacement du script. – Jay

+0

-1 Je ne peux pas dire si cela répond à la question ou non. Pouvez-vous me montrer un exemple? –

135

Ceci est équivalent au chemin du script:

%~dp0 

Il utilise la syntaxe d'extension des paramètres de traitement par lots. Le paramètre 0 est toujours le script lui-même.

Si votre script est stocké à C:\example\script.bat, alors %~dp0 est évalué à C:\example\.

ss64.com a plus d'informations sur la syntaxe d'extension de paramètre. Voici l'extrait pertinent:

Vous pouvez obtenir la valeur de n'importe quel paramètre en utilisant un% suivi de sa position numérique sur la ligne de commande.

[...]

Lorsqu'un paramètre est utilisé pour fournir un nom de fichier peut alors être appliquée la syntaxe étendue suivante:

[...]

% ~ d1% 1 Expand à une lettre de lecteur uniquement - C:

[...]

% ~ p1 Expand% 1 à un chemin que par exemple \ utils \ ceci inclut un \ qui peut être interprété comme un caractère d'échappement par certaines commandes.

[...]

Les modificateurs ci-dessus peuvent être combinés:

% ~ DP1 Élargissez% 1 à une lettre de lecteur et le chemin que

[...]

Vous pouvez obtenir le chemin du script de lot lui-même avec% 0, les extensions de paramètres peuvent être appliquées à cela, ainsi% ~ dp0 retournera le lecteur et le chemin vers le script de lot, par exemple W: \ scripts \

+0

Exactement ce dont j'avais besoin. Et j'ai lié cette anwser à mon blog, comme un rappel :) –

+0

Je ne sais pas si c'est un bug/erreur dans le texte cité, mais dans mon script j'ai besoin de "% ~ d0" pour obtenir la lettre de lecteur! % ~ d1 est vide dans mon cas. – eftokay83

+0

Dans mes yeux/situation c'est supérieur à la réponse acceptée.Si vous exécutez un script de ligne de commande "en tant qu'administrateur" (clic droit dessus), votre script sera exécuté à partir de Windows \ system32. La réponse acceptée ne vous donnera PAS l'emplacement du script, elle vous donnera à nouveau Windows \ system32. C'est à dire. CETTE réponse vous aide à corriger cela, vous commencez votre script avec cd% ~ dp0 –

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

pushd %curdir% 

Source