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
e 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.bat
e 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 for
em um arquivo BAT, também precisa dobrar %
para que ele tenha um significado especial para for
comandar, 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, %%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)
- 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 for
comando de porcentagem de entrada literal , no entanto, observe que, diferentemente dos arquivos BAT ao digitar o for
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.
<test>
. Simplesmente não pode ser feito usando as funções de gerenciamento de arquivos do Windows.