405 votes

Que signifie %~d0 dans un fichier batch Windows?

Je regarde un fichier batch qui définit les variables suivantes :

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Que signifient réellement %~d0 ou %~p0 ?
  • Existe-t-il un ensemble de valeurs bien connues pour des choses comme le répertoire actuel, le lecteur, les paramètres d'un script ?
  • Y a-t-il d'autres raccourcis similaires que je pourrais utiliser ?

0 votes

Également décrit en détail dans cette réponse : stackoverflow.com/a/5034119/4575793

614voto

JacquesB Points 19878

Les variables magiques %n contiennent les arguments utilisés pour invoquer le fichier : %0 est le chemin vers le fichier bat lui-même, %1 est le premier argument après, %2 est le deuxième, et ainsi de suite.

Comme les arguments sont souvent des chemins de fichiers, il existe une syntaxe supplémentaire pour extraire des parties du chemin. ~d est le lecteur, ~p est le chemin (sans le lecteur), ~n est le nom du fichier. Ils peuvent être combinés donc ~dp est le lecteur+chemin.

%~dp0 est donc assez utile dans un fichier bat : c'est le dossier dans lequel le fichier bat en cours d'exécution se trouve.

Vous pouvez également obtenir d'autres types d'informations métadonnées sur le fichier : ~t est l'horodatage, ~z est la taille.

Consultez ici pour une référence de toutes les commandes en ligne. Les codes magiques tilde sont décrits sous for.

32 votes

Note à moi-même : echo %~dp0 ne fonctionnera pas dans la ligne de commande, seulement dans un fichier batch. Duh!

2 votes

Y a-t-il une différence entre %~d0 et %~d0%?

3 votes

@Pacerier: %0 est le chemin complet incluant le nom du fichier du script. %~dp0 est le chemin vers le dossier contenant le script mais à l'exclusion du nom du fichier du script.

171voto

efotinis Points 6338

Ils sont des substitutions de variables améliorées. Ils modifient les variables %N utilisées dans les fichiers batch. Très utile si vous êtes dans la programmation de batch sous Windows.

%~I         - étend %I en supprimant les guillemets ""

%~fI        - étend %I en un nom de chemin complet

%~dI        - étend %I en uniquement une lettre de lecteur

%~pI        - étend %I en uniquement un chemin

%~nI        - étend %I en uniquement un nom de fichier

%~xI        - étend %I en uniquement une extension de fichier

%~sI        - le chemin étendu contient seulement des noms courts

%~aI        - étend %I aux attributs de fichier du fichier

%~tI        - étend %I à la date/heure du fichier

%~zI        - étend %I à la taille du fichier

%~$PATH:I   - recherche les répertoires répertoriés dans la variable d'environnement PATH et étend %I au nom complet du premier trouvé. Si le nom de variable d'environnement n'est pas défini ou si le fichier n'est pas trouvé par la recherche, alors ce modificateur s'étend à une chaîne vide

Vous pouvez trouver ce qui précède en exécutant FOR /?.

0 votes

Cette documentation en ligne est très confuse. Je n'ai jamais rencontré un programmeur qui savait regarder dans for /? pour trouver des documents sur une variable utilisée en dehors d'une boucle for ! De plus, il n'est pas clair (pour moi et pour beaucoup d'autres) que expands %I signifie "vous pouvez remplacer I par 0". Néanmoins, cette réponse est toujours utile pour expliquer à d'autres où trouver les documents originaux.

52voto

Clewaks Points 131

Oui, il existe d'autres raccourcis que vous pouvez utiliser qui sont donnés ci-dessous. Dans votre commande, ~d0 signifierait la lettre du lecteur du 0ème argument.

~ étend la variable donnée
d obtient uniquement la lettre du lecteur
0 est l'argument que vous référencez

Comme le 0ème argument est le chemin du script, il obtient la lettre du lecteur du chemin pour vous. Vous pouvez également utiliser les raccourcis suivants.

%~1         - étend %1 en supprimant les guillemets (")
%~f1        - étend %1 en un nom de chemin entièrement qualifié
%~d1        - étend %1 à seulement une lettre de lecteur
%~p1        - étend %1 à seulement un chemin
%~n1        - étend %1 à seulement un nom de fichier
%~x1        - étend %1 à seulement une extension de fichier
%~s1        - le chemin étendu contient uniquement des noms courts
%~a1        - étend %1 aux attributs du fichier
%~t1        - étend %1 à la date/heure du fichier
%~z1        - étend %1 à la taille du fichier
%~$PATH:1   - recherche les répertoires répertoriés dans la variable d'environnement PATH
               et étend %1 au nom entièrement qualifié du premier répertoire trouvé. 
               Si le nom de la variable d'environnement n'est pas défini ou
               si le fichier n'est pas trouvé par la recherche, alors ce raccourci
               s'étend à une chaîne vide    

%~dp1       - étend %1 à seulement une lettre de lecteur et un chemin
%~nx1       - étend %1 à seulement un nom de fichier et une extension
%~dp$PATH:1 - recherche les répertoires répertoriés dans la variable d'environnement PATH
               pour %1 et étend à la lettre du lecteur et au chemin du premier trouvé.
%~ftza1     - étend %1 à une ligne de sortie similaire à DIR

Ceci peut également être trouvé directement dans l'invite de commandes lorsque vous exécutez CALL /? ou FOR /?

13voto

William Keller Points 2845

De Analyse de noms de fichiers dans un fichier batch et plus d'idiomes - Le tutoriel de Real :

Le chemin (sans lecteur) où se trouve le script : ~p0

Le lecteur où se trouve le script : ~d0

0 votes

Super lien et informations sur les ~[idiom]s. Explique également %~s0, le nom complet du script.

11voto

Marvin Thobejane Points 356

Un autre conseil qui aiderait beaucoup est que pour définir le répertoire actuel sur un autre lecteur, il faudrait d'abord utiliser %~d0, puis cd %~dp0. Cela changera le répertoire vers le lecteur du fichier batch, puis changera vers son dossier.

Pour les amateurs de commandes en une ligne, cd /d %~dp0 changera à la fois le lecteur et le répertoire :)

J'espère que cela aide quelqu'un.

8 votes

Une autre option est pushd %~dp0, qui ne pose aucun problème pour changer le lecteur actuel, et qui vous permet en prime de pouvoir popd pour retourner ultérieurement au lecteur/chemin d'origine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X