Que signifie% ~ dp0 et comment cela fonctionne-t-il?

1024

Je trouve cela %~dp0très utile et je l'utilise beaucoup pour rendre mes fichiers batch plus portables.

Mais le label lui-même me semble très cryptique ... Que ~fait-on? Cela dpsignifie- t -il conduire et chemin? Le fait-il 0référence au %0chemin d'accès au fichier de commandes qui inclut le nom du fichier?

Ou c'est juste une étiquette bizarre?

J'aimerais également savoir s'il s'agit d'une fonctionnalité documentée ou d'un élément susceptible d'être déconseillé.

Sebastián Grignoli
la source
2
Tu as raison, Hellen. Cette question ne s'est pas présentée lorsque j'ai recherché% ~ dp0. Peut-être parce qu'il a% ~ d0 sur son titre au lieu de% ~ dp0.
Sebastián Grignoli
9
SymbolHound est idéal pour effectuer des recherches sur des caractères autres que alphanumériques. Par exemple, recherchez%~dp0 . Habituellement, je trouve que les meilleurs résultats font référence au contenu sur SO.
DavidRR
SymbolHound n'a pas fonctionné pour moi avec la recherche symbolhound.com/?q=%25~dp0 . Cependant, cela a fonctionné: google.com/search?q=%25~dp0 - sayin '...
Kristopher
1
SymbolHound 2019: ne fonctionne pas et uMatrix indique qu'il se connecte à des sites tiers tels que blockchain.info et paypalobjects.com.
Nils Lindemann

Réponses:

811

Appel

for /?

dans la ligne de commande donne de l'aide sur cette syntaxe (qui peut également être utilisée en dehors de FOR, c'est juste l'endroit où l'aide peut être trouvée).

De plus, la substitution des références de variable FOR a été améliorée. Vous pouvez maintenant utiliser la syntaxe facultative suivante:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Les modificateurs peuvent être combinés pour obtenir des résultats composés:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

Dans les exemples ci-dessus,% I et PATH peuvent être remplacés par d'autres valeurs valides. La syntaxe% ~ se termine par un nom de variable FOR valide. Choisir des noms de variables majuscules comme% I le rend plus lisible et évite la confusion avec les modificateurs, qui ne sont pas sensibles à la casse.

Il existe différentes lettres que vous pouvez utiliser comme fpour "nom de chemin complet", dpour lettre de lecteur, ppour chemin, et elles peuvent être combinées. %~est le début de chacune de ces séquences et un nombre Iindique que cela fonctionne sur le paramètre %I(où %0est le nom complet du fichier de commandes, comme vous l'avez supposé).

schnaader
la source
2
Je ne connais personne d'autre, mais j'obtiens "L'utilisation suivante de l'opérateur de chemin dans la substitution de paramètres par lots n'est pas valide. Pour les formats valides, tapez CALL /? Ou FOR /?. La syntaxe de la commande est incorrecte." lors de l'utilisation I. Je dois utiliser à la 0place de I. Je ne sais pas si j'ai raté quelque chose ou quoi que ce soit, mais juste pour faire savoir aux gens.
mythofechelon
71
@BenHooper, Iest un espace réservé pour l'index variable. 0= le fichier appelant, 1= argument # 1, 2= argument # 2, etc ...
Chris
9
Cette réponse est bonne. Et exhaustif. Pour un peu plus de brièveté, j'aime la réponse à cette question presque en double: stackoverflow.com/questions/112055/…
Frank Nocke
1
Cette réponse est un peu déroutante car ces substitutions peuvent être utilisées en dehors de FOR.
David
348

(Tout d'abord, je voudrais recommander ce site de référence utile pour le lot: http://ss64.com/nt/ )

Puis juste une autre explication utile: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

La variable% ~ dp0

Le% ~ dp0 (qui est un zéro) variable lorsque référencé dans un fichier batch Windows va étendre à la d lettre et rive p ath de ce fichier batch.

Les variables% 0-% 9 font référence aux paramètres de ligne de commande du fichier de commandes. % 1-% 9 fait référence aux arguments de la ligne de commande après le nom du fichier de commandes. % 0 fait référence au fichier batch lui-même.

Si vous suivez le pourcentage (%) avec un caractère tilde (~), vous pouvez insérer un ou des modificateurs avant le numéro de paramètre pour modifier la façon dont la variable est développée. Le modificateur d se développe en lettre de lecteur et le modificateur p se développe en chemin du paramètre.

Exemple: Disons que vous avez un répertoire sur C: appelé bat_files, et dans ce répertoire se trouve un fichier appelé example.bat. Dans ce cas,% ~ dp0 (combinant les modificateurs d et p) se développera en C: \ bat_files.

Consultez cet article Microsoft pour une explication complète.

Consultez également ce fil de discussion .

Et une référence plus claire d' ici :

  • %CmdCmdLine% renverra la ligne de commande entière transmise à CMD.EXE

  • %* renverra le reste de la ligne de commande à partir du premier argument de ligne de commande (dans Windows NT 4,% * inclut également tous les espaces de tête)

  • %~dn renverra la lettre de lecteur de% n (n peut aller de 0 à 9) si% n est un chemin d'accès ou un nom de fichier valide (pas UNC)

  • %~pn renverra le répertoire de% n si% n est un chemin d'accès ou un nom de fichier valide (pas UNC)

  • %~nn renverra le nom de fichier uniquement de% n si% n est un nom de fichier valide

  • %~xn renverra l'extension de fichier uniquement de% n si% n est un nom de fichier valide

  • %~fn renverra le chemin d'accès complet de% n si% n est un nom de fichier ou un répertoire valide

AJOUTER 1

Je viens de trouver une bonne référence pour le mystérieux ~ opérateur tilde.

La %~chaîne est appelée opérateur de pourcentage tilde . Vous pouvez le trouver dans des situations telles que : %~0.

La :~chaîne est appelée opérateur tilde du côlon . Vous pouvez le trouver comme %SOME_VAR:~0,-1%.

AJOUTER 2 - 1:12 PM 7/6/2018

%1-%9reportez-vous aux arguments de la ligne de commande. S'ils ne sont pas des valeurs de chemin valides, %~dp1- %~dp9s'étendra tous à la même valeur que %~dp0. Mais si ce sont des valeurs de chemin valides, elles se développeront à leur propre valeur de pilote / chemin.

Par exemple: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Exécuter 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Exécuter 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
smwikipedia
la source
Également curieux de ce concept et trouvé la bonne clarification ici. Merci Mingge. ^ _ ^
Eugene
1
pour moi, il se développe en c: \ bat_files \ (avec séparateur de chemin de fuite)
santa
Les liens vers l'article Microsoft et le fil de discussion ne fonctionnent plus :(
wovano
151

La variable %0d'un script de commandes est définie sur le nom du fichier de commandes en cours d'exécution.

La ~dpsyntaxe spéciale entre le %et le 0dit essentiellement de développer la variable %0pour afficher la lettre de lecteur et le chemin d'accès, ce qui vous donne le répertoire actuel contenant le fichier de commandes!

Aide = Lien

Andy White
la source
@Andy, existe-t-il un moyen de tester %0directement dans la cmd sans enregistrer un fichier .bat sur le disque dur local?
Pacerier
Le lien est rompu et je ne parviens pas à trouver le lien correct. Une modification en attente a toujours le lien brisé.
George_E
45

% ~ dp0 se développe vers le chemin de répertoire actuel du fichier de commandes en cours d'exécution.

Pour bien comprendre, créons un fichier batch dans un répertoire.

C: \ script \ test.bat

avec contenu:

@echo off
echo %~dp0

Lorsque vous l'exécutez à partir de l'invite de commande, vous verrez ce résultat:

C: \ script \

nul
la source
41

Une autre astuce qui aiderait beaucoup est que pour définir le répertoire actuel sur un lecteur différent, il faudrait d' %~d0abord utiliser cd %~dp0. Cela changera le répertoire sur le lecteur du fichier de commandes, puis changera dans son dossier.

Alternativement, pour #oneLinerLovers, comme @Omni l'a souligné dans les commentaires, cd /d %~dp0cela changera à la fois le lecteur et le répertoire :)

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

Marvin Thobejane
la source
23
cda un paramètre intégré qui commutera à la fois le lecteur et le dossier:cd /d %~dp0
OmnipotentEntity
2
Vous avez raison et l' /dargument est utile, mais il mérite d'être publié en tant que réponse alternative candidate et non en tant que commentaire à celle-ci. Merci de l' avoir signalé, je ne le savais pas :)
Marvin Thobejane
4
vous pouvez également utiliser '' pushd% ~ dp0 '' pour changer de lecteur et de dossier
fmuecke
25

Excellent exemple du lanceur de shell portable de Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

Je ne sais pas ce que le négatif fait là-bas moi-même, mais ça marche un régal!

HansBKK
la source
11
+1 très utile. L'instruction if vérifie si une barre oblique inverse est présente et supprime la barre oblique inverse si nécessaire. Le négatif 1 de la condition extrait le dernier caractère et l'expression dans l'instruction set prend la chaîne de chemin moins le dernier caractère (qui est la barre oblique inverse).
Matt
1
négatif 1 est moins le dernier caractère. Lire la sous
phuclv
12

Un exemple serait bien - en voici un trivial

for %I in (*.*) do @echo %~xI

il répertorie uniquement les EXTENSIONS de chaque fichier dans le dossier actuel

pour des combinaisons de variables plus utiles (également répertoriées dans la réponse précédente) à partir de l'invite CMD execute: HELP FOR qui contient cet extrait

Les modificateurs peuvent être combinés pour obtenir des résultats composés:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line
administrateur
la source
j'ai "~ xI était inattendu en ce moment." essayer l'exemple - est-ce parce que j'utilise Win 7?
chapter3
Ce sont de bonnes informations, mais elles ne répondent pas au message d'origine.
De Shan Baptiste