Que signifie% ~ d0 dans un fichier batch Windows?

355

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

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Que signifie %~d0ou %~p0signifie réellement?
  • 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?
  • Existe-t-il d'autres raccourcis similaires que je pourrais utiliser?
Chris Smith
la source

Réponses:

541

La variable magique %n contient les arguments utilisés pour appeler le fichier: %0est le chemin d'accès au fichier bat lui-même, %1est le premier argument après, %2est le deuxième et ainsi de suite.

Étant donné que les arguments sont souvent des chemins de fichier, il existe une syntaxe supplémentaire pour extraire des parties du chemin. ~dest le lecteur, ~pest le chemin (sans lecteur), ~nest le nom du fichier. Ils peuvent être combinés de même que ~dplecteur + chemin.

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

Vous pouvez également obtenir d'autres types de méta-informations sur le fichier: ~tc'est l'horodatage, ~zc'est la taille.

Recherchez ici une référence pour toutes les commandes de ligne de commande. Les codes tilde-magic sont décrits sous pour .

JacquesB
la source
15
note à soi-même: echo %~dp0ne fonctionnera pas en ligne de commande, uniquement dans un fichier de commandes. Duh!
northben
2
y a-t-il une différence entre %~d0et %~d0%?
Geoffrey
2
@Pacerier:% 0 est le chemin complet incluant le nom de fichier du script. % ~ dp0 est le chemin d'accès au dossier contenant le script mais excluant le nom de fichier du script.
JacquesB
4
note à soi: echo %~pd0donne la même sortie que l'écho %~dp0(au lieu de l'inverse comme prévu). En outre, la valeur de %0est différente selon que vous double-cliquez sur le fichier de commandes ou que vous l'exécutez à partir de cmd.
Pacerier
152

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

%~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

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

efotinis
la source
48

Oui, vous pouvez utiliser d'autres raccourcis ci-dessous. Dans votre commande, ~ d0 signifierait la lettre de lecteur du 0ème argument.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

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

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 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    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Cela peut également être trouvé directement dans l'invite de commande lorsque vous exécutez CALL /? ou pour /?

Clewaks
la source
9

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 va changer le répertoire sur le lecteur du fichier batch, puis changer dans son dossier.

Pour #oneLinerLovers, cd /d %~dp0changera à la fois le lecteur et le répertoire :)

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

Marvin Thobejane
la source
7
une autre option est pushd %~dp0, qui n'a aucun problème à changer le lecteur actuel, et vous donne l'avantage supplémentaire de pouvoir popdrevenir au lecteur / chemin d'origine plus tard.
bcrist
7

%~d0vous donne la lettre de lecteur de l'argument 0 (le nom du script), %~p0le chemin.

Armin Ronacher
la source
6

Quelques pièges à surveiller:

Si vous double-cliquez sur le fichier batch %0sera entouré de guillemets. Par exemple, si vous enregistrez ce fichier sous c:\test.bat:

@echo %0
@pause

Double-cliquez dessus pour ouvrir une nouvelle invite de commande avec sortie:

"C:\test.bat"

Mais si vous ouvrez d'abord une invite de commande et l'appelez directement à partir de cette invite de commande, %0vous vous référez à tout ce que vous avez tapé . Si vous tapez test.batEnter, la sortie de %0n'aura pas de guillemets car vous n'avez tapé aucun guillemet:

c:\>test.bat
test.bat

Si vous tapez testEnter, la sortie de %0n'aura pas d'extension non plus, car vous n'avez tapé aucune extension:

c:\>test
test

Pareil pour tEsTEnter:

c:\>tEsT
tEsT

Si vous tapez "test"Enter, la sortie de %0aura des guillemets (puisque vous les avez tapés) mais pas d'extension:

c:\>"test"
"test"

Enfin, si vous tapez "C:\test.bat", la sortie serait exactement comme si vous aviez double-cliqué dessus:

c:\>"C:\test.bat"
"C:\test.bat"

Notez que ce ne sont pas toutes les valeurs %0possibles car vous pouvez appeler le script à partir d'autres dossiers:

c:\some_folder>/../teST.bAt
/../teST.bAt

Tous les exemples ci-dessus affecteront également %~0, car la sortie de %~0est simplement la sortie des %0 guillemets négatifs (le cas échéant).

Pacerier
la source
3

Ce code explique l'utilisation du caractère ~ tilda, ce qui était la chose la plus déroutante pour moi. Une fois que j'ai compris cela, cela rend les choses beaucoup plus faciles à comprendre:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
djangofan
la source
1

Il affiche l'emplacement actuel du fichier ou du répertoire dans lequel vous vous trouvez actuellement. Par exemple; si votre fichier de commandes était dans le répertoire du bureau, alors "% ~ dp0" afficherait le répertoire du bureau. si vous voulez qu'il affiche le répertoire courant avec le nom de fichier actuel, vous pouvez taper "% ~ dp0% ~ n0% ~ x0".

zask
la source
"% ~ dpnx0" serait mieux
FrinkTheBrave