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
Ir para o Windows Explorer, e crie uma pasta / diretório chamado %systemdrive%, %windir%ou qualquer outra variável existente.
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:
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?
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: com1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9connulprn.
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.
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.
<test>
. Simplesmente não pode ser feito usando as funções de gerenciamento de arquivos do Windows.\\?\C:\USERS\DEFAULT\<test>
).cmd
shell ...F:\test>md \\?\f:\test\<test>
A sintaxe do comando está incorreta.md \\^?\f:\test\^<test^>
?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.exe
ecommand.com
)A diferença é:
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,
echo %windir%
produz saída:c:\windows
echo %%windir%%
produz saída:%windir%
echo %%%%windir%%%%
produz output:%%windir%%
Portanto, se você salvar a seguinte linha como
test.bat
e executá-la, ele criará um diretório chamado%test%
complete com sinais de porcentagem:Se não houver variável nomeada
test
, este próximo comando será equivalente ao último - ele também criará um diretório%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
for
em um arquivo BAT, também precisa dobrar%
para que ele tenha um significado especial parafor
comandar, em vez de para o próprio shell de comando:Isso produzirá uma lista de arquivos no diretório atual (ou seja,
%%i
tem um significado especial), e não tenho certeza de como fazê-lo produzir literalmente%%i
sem recorrer à%p%
solução alternativa descrita na próxima seção (%%%%i
nã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)echo %windir%
produz saída:c:\windows
echo %^windir%
produz saída:%windir%
echo "%^windir%"
produz saída:"%^windir%"
(com extra^
- não o que queríamos)Eu recomendo outra solução alternativa:
set "p=%"
%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
for
comando de porcentagem de entrada literal , no entanto, observe que, diferentemente dos arquivos BAT ao digitar ofor
comando 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.
fonte
<kbd>
.code blocks
. Mas se essa pergunta surgir, acho que elas causam confusão.^
.%
é "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".%
emfor
se issofor
está dentro de um arquivo em lotes. Digitarfor %%i in (*) do echo %%i
em uma janela de comando propmt produz um erro citando uma aparência inadequada de%%i
.