web-dev-qa-db-fra.com

Que signifie% ~ d0 dans un fichier batch Windows?

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

_set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
_
  • Que signifie réellement _%~d0_ ou _%~p0_?
  • Existe-t-il un ensemble de valeurs connues pour des éléments tels que le répertoire en cours, le lecteur, les paramètres d'un script?
  • Existe-t-il d'autres raccourcis similaires que je pourrais utiliser?
330
Chris Smith

Les variables magiques % n contient les arguments utilisés pour appeler le fichier: %0 est le chemin du fichier bat , %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 lecteur), ~n est le nom du fichier. Ils peuvent être combinés pour que ~dp soit lecteur + chemin.

%~dp0 est donc très 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: ~t est l'horodatage, ~z est la taille.

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

496
JacquesB

Ce sont des substitutions variables améliorées. Ils modifient les variables% N utilisées dans les fichiers de commandes. Très utile si vous aimez 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 /? .

141
efotinis

Oui, il existe d’autres raccourcis que vous pouvez utiliser et qui sont donnés 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 la lettre de lecteur du chemin pour vous. 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 /?

48
Clewaks

De Analyse de nom de fichier dans un fichier de commandes et plusieurs idiomes - Real-How-to:

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

Le lecteur où se trouve le script: ~ d0

10
William Keller

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

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

J'espère que ça aide quelqu'un.

9
Marvin Thobejane

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

7
Armin Ronacher

Quelques pièges à surveiller:

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

@echo %0
@pause

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

"C:\test.bat"

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

c:\>test.bat
test.bat

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

c:\>test
test

Idem pour tEsTEnter:

c:\>tEsT
tEsT

Si vous tapez "test"Enter, le résultat de %0 aura des guillemets (puisque vous les avez saisis) mais aucune extension:

c:\>"test"
"test"

Enfin, si vous tapez "C:\test.bat", le résultat sera exactement comme si vous l'aviez double-cliqué:

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

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

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

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

6
Pacerier

Ce code explique l'utilisation du caractère ~ tilda, ce qui m'a le plus dérouté. 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
3
djangofan

Il affiche l'emplacement actuel du fichier ou du répertoire dans lequel vous vous trouvez. Par exemple; si votre fichier de commandes se trouvait dans le répertoire du bureau, "% ~ dp0" afficherait le répertoire du bureau. si vous souhaitez afficher le répertoire en cours avec le nom du fichier en cours, vous pouvez taper "% ~ dp0% ~ n0% ~ x0".

0
zask