La réponse de DavidPostill est excellente, mais peut un peu dérouter les nouveaux arrivants. Je vais essayer de reformuler.
%
n'est pas un caractère réservé .
C'est un personnage avec une signification spéciale pour le shell de commande (aka cmd.exe
et command.com
)
La différence est:
- vous ne pouvez pas utiliser du tout de caractères réservés (mais voir ci-dessous)
- vous pourrez peut-être utiliser des caractères spéciaux et d'échappement - mais pas en les tapant tels quels
En d'autres termes, vous pouvez créer un fichier ou un dossier contenant %
leur nom. Vous pouvez le faire directement à l'aide de l'explorateur Windows car il %
n'a aucune signification particulière. Il n'y avait pas non plus l'intention de vous empêcher de créer de tels fichiers à l'invite de commande, mais comme cela %
a une signification particulière, vous devez utiliser la syntaxe décrite ci-dessous pour créer de tels fichiers.
Fichiers BAT
Si vous écrivez un fichier batch (* .bat, * .cmd), qui est exécuté par le shell de commande (alias l'application d'invite de commandes), à utiliser %
littéralement (comme pour créer un fichier avec %
le nom, et non pour le remplacer une variable ou un paramètre) que vous devez saisir à la %%
place.
Par exemple,
- commande
echo %windir%
produit une sortie:c:\windows
- cependant, la commande
echo %%windir%%
produit une sortie:%windir%
- et ainsi de suite: la commande
echo %%%%windir%%%%
produit une sortie:%%windir%%
Donc, si vous enregistrez la ligne suivante sous test.bat
et l'exécutez, cela créera un répertoire nommé %test%
complet avec des signes de pourcentage:
md %%test%%
S'il n'y a pas de variable nommée test
, cette commande suivante est équivalente à la dernière - elle crée également un répertoire %test%
:
md %test%
... mais ne le faites jamais comme ça, car votre commande ne se comportera pas comme vous le souhaitiez une fois que quelqu'un aura créé une variable avec ce nom
Si vous avez l'intention d'utiliser la commande for
dans un fichier BAT, vous devez également doubler %
afin qu'il ait une signification particulière à for
commander au lieu de pour le shell de commande lui-même:
for %%i in (*.*) do echo %%i
Cela produira une liste de fichiers dans le répertoire actuel (c'est-à-dire %%i
a une signification spéciale), et je ne sais pas comment le faire produire littéralement %%i
sans recourir à la %p%
solution de contournement décrite dans la section suivante ( %%%%i
ne fonctionne pas ici).
%
n'est pas le seul caractère ayant une signification particulière à l'invite de commande. D' autres comprennent ^
, <
, >
, |
, (
, )
, &
, !
, "
. La plupart de ceux-ci (à l'exclusion "
) peuvent être échappés - c'est-à-dire préfixés d'un caractère d'échappement ^
afin qu'un caractère littéral soit inséré, supprimant sa signification spéciale. Ceux perdent également leur fonction spéciale à l' intérieur chaîne doublequoted, et "
se réfugiera avec une barre oblique inverse: \"
. Certains carets ( ^
) peuvent devoir être doublés à l'intérieur d'une chaîne entre guillemets doubles et là où la substitution de variable retardée a lieu ( !
signification spéciale).
Invite de commande
Malheureusement, lors de la saisie directe de commandes dans la fenêtre d'invite de commandes, le doublage de %
caractères produit simplement, %%
c'est-à-dire que l'approche ci-dessus ne fonctionne pas dans ce cas.
Il semble y avoir une solution de contournement exploitant une bizarrerie dans le traitement des commandes - vous pouvez obtenir un littéral %
en tapant ^
après %
. Cette approche n'est cependant pas infaillible: si votre nom de fichier est placé entre guillemets, il ^
est interprété littéralement (et n'est pas supprimé comme sans guillemets)
- commande
echo %windir%
produit une sortie:c:\windows
- commande
echo %^windir%
produit une sortie:%windir%
- la commande
echo "%^windir%"
produit une sortie: "%^windir%"
(avec extra ^
- pas ce que nous voulions)
Je recommande une autre solution de contournement à la place:
- créer une variable comme celle-ci:
set "p=%"
- utilisez
%p%
partout où vous avez besoin d'un signe de pourcentage littéral: echo "%p%windir%p%"
produira désormais une sortie:"%windir%"
La même solution de contournement peut être utilisée pour obtenir une for
commande de connexion littérale en pourcentage , mais notez que contrairement aux fichiers BAT lorsque vous saisissez for
directement la commande, vous ne doublez pas les signes de pourcentage.
Caractères réservés au système de fichiers
Vous ne pouvez pas normalement créer un fichier ou un répertoire contenant les caractères réservés suivants dans son nom /
?
<
>
\
:
*
|
"
:, symbole NULL et caractères avec les codes 1 à 31; aussi .
et l' espace ne peut pas être le dernier caractère; et les suivants sont illégales: com1
com2
com3
com4
com5
com6
com7
com8
com9
lpt1
lpt2
lpt3
lpt4
lpt5
lpt6
lpt7
lpt8
lpt9
con
nul
prn
.
Cependant, certaines de ces restrictions peuvent être contournés préfixer chemin du fichier avec \\?\
comme ceci: \\?\c:\test...\nul
. Au moins les fichiers avec des noms réservés et ceux se terminant par un espace et un point peuvent être manipulés de cette façon.
De plus, le système de fichiers NTFS lui-même prend en charge plusieurs sous-systèmes de dénomination: DOS, Windows et POSIX. C'est le sous-système Windows qui a toutes les restrictions ci-dessus, tandis que POSIX interdit uniquement /
et le symbole NULL.
GNU / Linux OS (un sur-ensemble de POSIX) peut ainsi créer (et supprimer) des noms de fichiers / répertoires avec lesquels la plupart des fonctions normales de l'API Windows (et donc des programmes Windows) ne peuvent pas fonctionner. Sur Windows XP, travailler avec eux était possible en installant gratuitement le "sous-système Services For Unix" (SFU); sur Vista et au-dessus, des outils tiers sont nécessaires pour cela. Je ne sais pas si le nouveau sous-système ubuntu-on-windows10 peut le faire.
<test>
. Cela ne peut tout simplement pas être fait en utilisant les fonctions de gestion de fichiers de Windows.