No Windows Explorer, por que podemos criar uma pasta ou arquivo com o símbolo de porcentagem (%), se o símbolo de porcentagem é usado para variáveis ​​existentes?

13
  1. Ir para o Windows Explorer, e crie uma pasta / diretório chamado %systemdrive%, %windir%ou qualquer outra variável existente.
  2. Abra um prompt de comando e vá para a pasta que você acabou de criar.

Você não pode, porque existem %símbolos de porcentagem ( ) no nome da pasta, confundindo o prompt de comando, porque o símbolo de porcentagem é usado para variáveis ​​existentes.

Escapar do %símbolo de porcentagem ( ) com dois símbolos de porcentagem ( %%) não funciona, portanto, a resposta de DavidPostill está errada:

Janela do prompt de comando, com um pouco da área de trabalho do Explorer mostrando Portanto, no Windows Explorer, por que podemos criar uma pasta ou arquivo com o %símbolo de porcentagem ( ), se o símbolo de porcentagem é usado para variáveis ​​existentes?

The Tech Guy
fonte

Respostas:

16

Por que podemos criar uma pasta / arquivo com o símbolo de porcentagem?

O %caractere não é um caractere reservado em um nome de arquivo.

Os caracteres reservados para nomear arquivos, caminhos e espaços para nome são:

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

Arquivos de nomeação de origem , caminhos e espaços para nome


O símbolo de porcentagem é reservado para variáveis

Agora, abra um prompt de comando e tente ir para a pasta que você criou.

Você não pode, porque existem símbolos de porcentagem no nome da pasta, indicando que é uma variável.

O exposto acima não é verdade. Tudo funciona exatamente como você esperaria.

Exemplo usando %test%:

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

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Exemplo usando %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

Escapando por cento

O %caractere tem um significado especial para parâmetros e FORparâmetros da linha de comando .

Para tratar uma porcentagem como um caractere regular, dobre-a:

%%

Sintaxe de origem


Leitura adicional

DavidPostill
fonte
1
Nota: nem todos os caracteres reservados se aplicam ao sistema de arquivos NTFS. Usando o Linux, por exemplo, posso criar facilmente um arquivo chamado <test>. Simplesmente não pode ser feito usando as funções de gerenciamento de arquivos do Windows.
Nathan Osman
2
@NathanOsman Você pode criar arquivos com esses nomes no Windows usando a notação de caminho absoluto bruto ( \\?\C:\USERS\DEFAULT\<test>).
Zwol
@zwol oh? Eu não sabia disso. É bom saber disso.
Nathan Osman
@zwol Não é de um cmdshell ... F:\test>md \\?\f:\test\<test> A sintaxe do comando está incorreta.
DavidPostill
@DavidPostill What about md \\^?\f:\test\^<test^>?
Zwol
11

A resposta de DavidPostill é ótima, mas pode confundir um pouco os recém-chegados. Vou tentar reformular.

%não é um caractere reservado .

É um personagem com significado especial para o shell de comando (aka cmd.exee command.com)

A diferença é:

  • você não pode usar caracteres reservados (mas veja abaixo)
  • você poderá usar caracteres especiais e de escape - apenas não digitando-os como estão

Em outras palavras, você pode criar um arquivo ou pasta que contenha %seu nome. Você pode fazer isso diretamente usando o Windows Explorer, porque %não tem um significado especial. Também não havia intenção de impedir que você criasse esses arquivos no prompt de comando, mas como %tem um significado especial, é necessário usar a sintaxe descrita abaixo para criar esses arquivos.

Arquivos BAT

Se você estiver gravando um arquivo em lotes (* .bat, * .cmd), executado pelo shell de comando (também conhecido como aplicativo de prompt de comando), para usá-lo %literalmente (como criar um arquivo com %o nome e não substituí-lo) uma variável ou parâmetro), você precisa digitar %%.

Por exemplo,

  • O comando echo %windir%produz saída:c:\windows
  • no entanto, o comando echo %%windir%%produz saída:%windir%
  • e assim por diante: command echo %%%%windir%%%%produz output:%%windir%%

Portanto, se você salvar a seguinte linha como test.bate executá-la, ele criará um diretório chamado %test%complete com sinais de porcentagem:

md %%test%%

Se não houver variável nomeada test, este próximo comando será equivalente ao último - ele também criará um diretório %test%:

md %test%

... mas nunca faça isso assim, pois seu comando não se comportará da maneira que você queria quando alguém criar uma variável com esse nome

Se você pretende usar o comando forem um arquivo BAT, também precisa dobrar %para que ele tenha um significado especial para forcomandar, em vez de para o próprio shell de comando:

for %%i in (*.*) do echo %%i

Isso produzirá uma lista de arquivos no diretório atual (ou seja, %%item um significado especial), e não tenho certeza de como fazê-lo produzir literalmente %%isem recorrer à %p%solução alternativa descrita na próxima seção ( %%%%inão funciona aqui).

%não é o único caractere com significado especial no prompt de comando. Outros incluem ^, <, >, |, (, ), &, !, ". A maioria deles (excluindo ") pode ser escapada - ou seja, prefixada com um caractere de escape ^para que um caractere literal seja inserido, suprimindo seu significado especial. Aqueles também perdem a sua função especial dentro corda doublequoted, e "escapou com uma barra invertida: \". Alguns circunflexos ( ^) podem precisar ser duplicados dentro de uma cadeia de caracteres entre aspas duplas e onde ocorre uma substituição tardia de variáveis ​​( !significado especial).

Prompt de comando

Infelizmente, ao digitar comandos diretamente na janela do prompt de comando, %apenas o dobramento de caracteres produz, %%ou seja, a abordagem acima não funciona nesse caso.

Parece haver uma solução alternativa para explorar uma peculiaridade no processamento de comandos - você pode obter literal %digitando ^depois %. Essa abordagem não é infalível: se o seu nome de arquivo estiver entre aspas duplas, ^é interpretado literalmente (e não removido como sem aspas)

  • O comando echo %windir%produz saída:c:\windows
  • O comando echo %^windir%produz saída:%windir%
  • O comando echo "%^windir%"produz saída: "%^windir%"(com extra ^- não o que queríamos)

Eu recomendo outra solução alternativa:

  • crie uma variável como esta: set "p=%"
  • use %p%sempre que precisar de um sinal de porcentagem literal: echo "%p%windir%p%"agora produzirá saída:"%windir%"

A mesma solução alternativa pode ser usada para obter o forcomando de porcentagem de entrada literal , no entanto, observe que, diferentemente dos arquivos BAT ao digitar o forcomando diretamente, você não duplica os sinais de porcentagem.

Caracteres reservados do sistema de arquivos

Você normalmente não pode criar um arquivo ou diretório contendo os seguintes caracteres reservados em seu nome / ? < > \ : * | ":, símbolo NULL e caracteres com códigos de 1 a 31; também .e espaço não podem ser os últimos caracteres; e seguintes nomes são ilegais: com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn.

No entanto, algumas destas restrições pode ser contornado prefixo caminho do arquivo com \\?\como este: \\?\c:\test...\nul. Pelo menos os arquivos com nomes reservados e aqueles que terminam com espaço e ponto podem ser manipulados dessa maneira.

Além disso, o próprio sistema de arquivos NTFS suporta vários subsistemas de nomes: DOS, Windows e POSIX. É o subsistema Windows que possui todas as restrições acima, enquanto o POSIX proíbe apenas o /símbolo NULL.

O SO GNU / Linux (um superconjunto do POSIX) pode, assim, criar (e excluir) nomes de arquivos / diretórios com os quais a maioria das funções normais da API do Windows (e, portanto, programas do Windows) não podem trabalhar. No Windows XP, era possível trabalhar com eles instalando o "Services For Unix subsystem" (SFU); no Vista e acima de ferramentas de terceiros são necessárias para isso. Não tenho certeza se o novo subsistema ubuntu-on-windows10 pode fazer isso.

Jack White
fonte
Por que você usa marcas de teclado para nomes de caminho / comando? Seria sintaticamente mais correto e mais legível se você apenas usasse a formatação de código embutido. Também seria mais fácil digitar: um backtick em vez de <kbd>.
Cody Grey
feito. Eu pensei que as <kbd> tags </kbd> tinham um esboço muito mais claro do que code blocks. Mas se essa pergunta surgir, acho que elas causam confusão.
Jack White
2
"É um símbolo de escape do shell de comando" Não está correto. O caractere de escape no cmd é ^. %é "um caractere que tem um significado especial para os parâmetros da linha de comando e para os parâmetros FOR. Para tratar uma porcentagem como um caractere regular, duplique".
DavidPostill
Na verdade, eu tinha os termos misturados. Agora corrigiu a resposta. Obrigado.
Jack White
Também vale lembrar, conforme descrito na minha resposta, você só duas vezes %em forse isso forestá dentro de um arquivo em lotes. Digitar for %%i in (*) do echo %%iem uma janela de comando propmt produz um erro citando uma aparência inadequada de %%i.
Jack White