2008-09-21 7 views
260

Je suis à la recherche d'un fichier batch qui définit les variables suivantes:Que signifie% ~ d0 dans un fichier de commandes Windows?

set _SCRIPT_DRIVE=%~d0 
set _SCRIPT_PATH=%~p0 
  • Que %~d0 ou %~p0 signifie réellement?
  • Y at-il un ensemble de valeurs bien connues pour des choses comme le répertoire courant, le lecteur, les paramètres d'un script?
  • Existe-t-il d'autres raccourcis similaires que je pourrais utiliser?

Répondre

413

Les variables magiques %n contient les arguments utilisés pour appeler le fichier: %0 est le chemin d'accès au fichier de chauve-souris lui-même, %1 est le premier argument après, %2 est la seconde 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. ~d est le lecteur, ~p est le chemin (sans lecteur), ~n est le nom de fichier. Ils peuvent être combinés de sorte que ~dp soit drive + path.

%~dp0 est donc très utile dans une chauve-souris: c'est le dossier dans lequel réside le fichier bat 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 here pour une référence pour toutes les commandes de ligne de commande. Les codes tilde-magic sont décrits sous for.

+1

Il est également décrit dans la commande "call", qui, accessoirement, fonctionne avec des fichiers batch. :) – user314104

+1

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

+5

note à moi-même: 'echo% ~ dp0' sera ne fonctionne pas sur la ligne de commande, uniquement dans un fichier batch. Duh! – northben

7

De here:

Le chemin (sans disque) où le script est: ~ p0

Le lecteur où le script est: ~ d0

5

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

117

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 dans 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 trouverez ci-dessus en exécutant FOR /?.

34

Oui, d'autres raccourcis que vous pouvez utiliser sont donnés ci-dessous. Dans votre commande, ~ d0 signifierait la lettre de lecteur du 0e argument.

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

Comme le 0ème argument est 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 /?

2

Ce code explique l'utilisation du caractère ~ tilda, qui était la chose la plus confuse pour moi. Une fois que je compris cela, il 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 
6

Une autre astuce qui aiderait beaucoup est que pour définir le répertoire en cours à un lecteur différent on aurait pu utiliser %~d0 premier, puis cd %~dp0. Cela va changer le répertoire pour le lecteur du fichier de commandes, puis changer pour son dossier.

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

Hope this helps quelqu'un.

+4

une autre option est 'pushd% ~ dp0', qui n'a aucun problème pour changer le disque en cours, et vous donne le bonus supplémentaire de pouvoir revenir au lecteur/chemin d'origine plus tard. – bcrist

1

Quelques pièges à surveiller:

Si vous double-cliquez sur le fichier lot %0 sera entouré par des guillemets. Par exemple, si vous enregistrez ce fichier comme c:\test.bat:

@echo %0 
@pause 

Double-clic ouvrira une nouvelle invite de commande avec une sortie:

"C:\test.bat" 

Mais si vous ouvrez une invite de commande et appelez directement à partir de cette invite de commande, %0 fera référence à ce que vous avez tapé.Si vous tapez test.batEntrez, la sortie de %0 aura pas de guillemets parce que vous avez saisi sans guillemets:

c:\>test.bat 
test.bat 

Si vous tapez testEntrez, la sortie de %0 aurez aussi aucune extension, parce que vous avez saisi pas d'extension:

c:\>test 
test 

même chose pour tEsTEntrez:

c:\>tEsT 
tEsT 

Si vous tapez "test"Entrez, la sortie %0 aura des citations (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 avez double-cliqué il:

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

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

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

Tous les exemples ci-dessus auront également une incidence %~0, parce que la sortie de %~0 est simplement la sortie de %0 cite moins (le cas échéant).

0

Affiche par exemple l'emplacement actuel du fichier ou du répertoire dans lequel vous vous trouvez. Si votre fichier batch se trouvait dans le répertoire du bureau, "% ~ dp0" afficherait le répertoire du bureau. Si vous voulez afficher le répertoire actuel avec le nom du fichier actuel, vous pouvez taper "% ~ dp0% ~ n0% ~ x0".

+0

"% ~ dpnx0" serait mieux – FrinkTheBrave