Dans l'Explorateur Windows, pourquoi pouvons-nous créer un dossier ou un fichier avec le symbole de pourcentage (%), si le symbole de pourcentage est utilisé pour les variables existantes?
13
Allez dans l' Explorateur Windows, et créer un dossier / répertoire nommé %systemdrive%, %windir%ou toute autre variable existante.
Ouvrez une invite de commande et accédez au dossier que vous venez de créer.
Vous ne pouvez pas, car il y a des %symboles de pourcentage ( ) dans le nom du dossier, ce qui déroute l'invite de commande, car le symbole de pourcentage est utilisé pour les variables existantes.
L'échappement du %symbole pourcent ( ) avec deux symboles pourcent ( %%) ne fonctionne pas, donc la réponse de DavidPostill est fausse:
Donc, dans l'Explorateur Windows, pourquoi pouvons-nous créer un dossier ou un fichier avec le %symbole pourcentage ( ), si le symbole pourcentage est utilisé pour les variables existantes?
Remarque: tous les caractères réservés ne s'appliquent pas au système de fichiers NTFS. En utilisant Linux, par exemple, je peux facilement créer un fichier nommé <test>. Cela ne peut tout simplement pas être fait en utilisant les fonctions de gestion de fichiers de Windows.
Nathan Osman
2
@NathanOsman Vous pouvez peut-être créer des fichiers avec ces noms à partir de Windows en utilisant la notation de chemin absolu brut ( \\?\C:\USERS\DEFAULT\<test>).
zwol
@zwol oh? Je ne le savais pas. C'est bon à savoir.
Nathan Osman
@zwol Pas depuis un cmdshell ... F:\test>md \\?\f:\test\<test> La syntaxe de la commande est incorrecte.
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.exeet 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.batet 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 fordans un fichier BAT, vous devez également doubler %afin qu'il ait une signification particulière à forcommander 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 %%ia une signification spéciale), et je ne sais pas comment le faire produire littéralement %%isans recourir à la %p%solution de contournement décrite dans la section suivante ( %%%%ine 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 forcommande de connexion littérale en pourcentage , mais notez que contrairement aux fichiers BAT lorsque vous saisissez fordirectement 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: com1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9connulprn.
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.
Pourquoi utilisez-vous des balises de clavier pour les noms de chemin / commande? Il serait à la fois syntaxiquement plus correct et plus lisible si vous utilisiez simplement la mise en forme du code en ligne. Il serait également plus facile de taper: un backtick au lieu de <kbd>.
Cody Gray
terminé. Je pensais que les <kbd> balises </kbd> avaient un contour beaucoup plus clair que code blocks. Mais si une telle question se posait, je suppose qu'elles causent de la confusion.
Jack White
2
"C'est un symbole d'échappement du shell de commande" Pas correct. Le caractère d'échappement dans cmd est ^. %est "un caractère qui a une signification particulière pour les paramètres de ligne de commande et les paramètres FOR. Pour traiter un pourcentage comme un caractère normal, doublez-le".
DavidPostill
En effet, j'avais les termes mélangés. Maintenant corrigé la réponse. Merci.
Jack White
Veuillez également noter, comme indiqué dans ma réponse, vous ne doubler %en forsi forc'est à l' intérieur d' un fichier batch. La for %%i in (*) do echo %%isaisie dans une fenêtre de commande propmt produit une erreur citant l'apparence inappropriée de %%i.
<test>
. Cela ne peut tout simplement pas être fait en utilisant les fonctions de gestion de fichiers de Windows.\\?\C:\USERS\DEFAULT\<test>
).cmd
shell ...F:\test>md \\?\f:\test\<test>
La syntaxe de la commande est incorrecte.md \\^?\f:\test\^<test^>
?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
etcommand.com
)La différence est:
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,
echo %windir%
produit une sortie:c:\windows
echo %%windir%%
produit une sortie:%windir%
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: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%
:... 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: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)echo %windir%
produit une sortie:c:\windows
echo %^windir%
produit une sortie:%windir%
echo "%^windir%"
produit une sortie:"%^windir%"
(avec extra^
- pas ce que nous voulions)Je recommande une autre solution de contournement à la place:
set "p=%"
%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 saisissezfor
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.
la source
<kbd>
.code blocks
. Mais si une telle question se posait, je suppose qu'elles causent de la confusion.^
.%
est "un caractère qui a une signification particulière pour les paramètres de ligne de commande et les paramètres FOR. Pour traiter un pourcentage comme un caractère normal, doublez-le".%
enfor
sifor
c'est à l' intérieur d' un fichier batch. Lafor %%i in (*) do echo %%i
saisie dans une fenêtre de commande propmt produit une erreur citant l'apparence inappropriée de%%i
.