Je regarde un fichier de commandes qui définit les variables suivantes:
_set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
_
%~d0
_ ou _%~p0
_?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 .
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 /?
.
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 /?
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
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.
%~d0
vous donne la lettre de lecteur de l'argument 0 (le nom du script), %~p0
le chemin.
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.bat
Enter, 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 test
Enter, la sortie de %0
n'aura pas non plus d'extension, car vous n'avez entré aucune extension:
c:\>test
test
Idem pour tEsT
Enter:
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).
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
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".