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
  1. Allez dans l' Explorateur Windows, et créer un dossier / répertoire nommé %systemdrive%, %windir%ou toute autre variable existante.
  2. 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:

Fenêtre d'invite de commande, avec un peu du bureau de l'Explorateur montrant 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?

The Tech Guy
la source

Réponses:

16

Pourquoi pouvons-nous créer un dossier / fichier avec le symbole de pourcentage?

Le %caractère n'est pas un caractère réservé dans un nom de fichier.

Les caractères réservés pour nommer les fichiers, les chemins et les espaces de noms sont:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Fichiers de nommage source , chemins et espaces de noms


Le symbole de pourcentage est réservé aux variables

Maintenant, ouvrez une invite de commande et essayez d'accéder au dossier que vous avez créé.

Vous ne pouvez pas, car il y a des symboles de pourcentage dans le nom du dossier, indiquant qu'il s'agit d'une variable.

Ce qui précède n'est pas vrai. Tout fonctionne comme prévu.

Exemple utilisant %test%:

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Exemple utilisant %systemdrive%:

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

Pourcentages d'échappement

Le %caractère a une signification particulière pour les paramètres de ligne de commande et les FORparamètres.

Pour traiter un pourcentage comme un caractère normal, doublez-le:

%%

Syntaxe de la source


Lectures complémentaires

DavidPostill
la source
1
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.
DavidPostill
@DavidPostill Qu'en est-il md \\^?\f:\test\^<test^>?
zwol
11

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: 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.

Jack White
la source
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.
Jack White