Question Que signifie% ~ dp0, et comment ça marche?


je trouve %~dp0 très utile, et je l'utilise beaucoup pour rendre mes fichiers batch plus portables.

Mais le label lui-même me semble très énigmatique ... quel est le ~ Faire? Est-ce que dp signifie lecteur et chemin? fait le 0 faire référence à %0, le chemin d'accès au fichier de commandes qui inclut le nom de fichier?

Ou est-ce juste un label bizarre?

J'aimerais aussi savoir s'il s'agit d'une fonctionnalité documentée ou quelque chose qui risque d'être obsolète.


810
2018-02-17 20:15


origine


Réponses:


Appel

for /?

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

En outre, la substitution de FOR   les références variables ont été améliorées.   Vous pouvez maintenant utiliser l'option suivante   syntaxe:

%~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   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é par d'autres valeurs valides.   La syntaxe% ~ est terminée par un valide   POUR le nom de la variable. Cueillette en majuscules   noms de variables comme% I le rend plus   lisible et évite la confusion avec le   modificateurs, qui ne sont pas cas   sensible.

Il y a différentes lettres que vous pouvez utiliser comme f pour "nom du chemin d'accès complet", d pour la lettre de lecteur, p pour le chemin, et ils peuvent être combinés. %~ est le début pour chacune de ces séquences et un certain nombre I indique qu'il fonctionne sur le paramètre %I (où %0 est le nom complet du fichier batch, comme vous l'avez supposé).


648
2018-02-17 20:19



(Premièrement, je voudrais recommander ce site de référence utile pour le lot: http://ss64.com/nt/)

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

La variable% ~ dp0

La variable% ~ dp0 (c'est-à-dire zéro) lorsqu'elle est référencée dans Windows   fichier de commandes va se développer à la lettre et path de ce lot   fichier.

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

Si vous suivez le caractère pourcentage (%) avec un caractère tilde (~),   vous pouvez insérer un modificateur (s) avant le numéro de paramètre pour modifier le   façon dont la variable est étendue. Le modificateur d s'étend au lecteur   La lettre et le modificateur p s'étendent jusqu'au chemin du paramètre.

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

Check-out cet article de Microsoft pour une explication complète.

En outre, consultez ce fil de discussion.

Et une référence plus claire de ici:

  • %CmdCmdLine%    retournera la ligne de commande entière comme transmis à CMD.EXE

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

  • %~dnretournera la lettre de lecteur de% n (n peut aller de 0 à 9) si% n est un chemin ou un nom de fichier valide (pas UNC)

  • %~pn    retournera le répertoire de% n si% n est un chemin ou un nom de fichier valide (pas UNC)

  • %~nn    retournera le nom de fichier seulement de% n si% n est un nom de fichier valide

  • %~xn    retournera l'extension de fichier seulement de% n si% n est un nom de fichier valide

  • %~fn    retournera le chemin 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.

le %~ chaîne est appelée pour cent tilde opérateur. Vous pouvez le trouver dans des situations comme: %~0.

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

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

%1-%9 reportez-vous aux arguments de la ligne de commande. Si ils sont ne pas valeurs de chemin valides, %~dp1 - %~dp9 va tous s'étendre à la même valeur que %~dp0. Mais s'ils sont valeurs de chemin d'accès valides, ils vont étendre à les leurs valeur du 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\

243
2018-04-24 01:51



http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

La variable %0 dans un script de traitement par lots est défini sur le nom du fichier de traitement en cours d'exécution. le ~dp syntaxe spéciale entre le % et le 0 dit essentiellement d'élargir la variable %0 pour montrer la lettre de lecteur et le chemin, ce qui vous donne le répertoire courant contenant le fichier batch!


137
2018-02-17 20:28



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

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

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


30
2017-09-14 08:54



% ~ dp0 se développe dans le chemin du répertoire courant du fichier séquentiel en cours d'exécution.

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

C: \ script \ test.bat

avec le contenu:

@echo off
echo %~dp0

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

C: \ script \


30
2017-11-25 08:44



Un bon exemple du lanceur portable shell 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 1 fait moi-même, mais ça marche un régal!


20
2017-09-25 18:39



Un exemple serait bien - voici un trivial

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

il liste uniquement les EXTENSIONS de chaque fichier dans le dossier en cours

Pour plus de combinaisons de variables utiles (également répertoriées dans la réponse précédente) à partir de l'invite CMD, exécutez: 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

10
2018-06-21 16:31