En el Explorador de Windows, ¿por qué podemos crear una carpeta o archivo con el símbolo de porcentaje (%), si el símbolo de porcentaje se usa para variables existentes?
13
Vaya al Explorador de Windows, y crear una carpeta / directorio llamado %systemdrive%, %windir%o cualquier otra variable existente.
Abra un símbolo del sistema y vaya a la carpeta que acaba de crear.
No puede, porque hay %símbolos de porcentaje ( ) en el nombre de la carpeta, lo que confunde el símbolo del sistema, porque el símbolo de porcentaje se usa para las variables existentes.
Escapar del %símbolo de porcentaje ( ) con dos símbolos de porcentaje ( %%) no funciona, por lo que la respuesta de DavidPostill es incorrecta:
Entonces, en el Explorador de Windows, ¿por qué podemos crear una carpeta o archivo con el %símbolo de porcentaje ( ), si el símbolo de porcentaje se usa para las variables existentes?
Nota: no todos los caracteres reservados se aplican al sistema de archivos NTFS. Usando Linux, por ejemplo, puedo crear fácilmente un archivo llamado <test>. Simplemente no se puede hacer usando las funciones de administración de archivos de Windows.
Nathan Osman
2
@NathanOsman Puede crear archivos con esos nombres desde Windows utilizando la notación de ruta absoluta sin formato ( \\?\C:\USERS\DEFAULT\<test>).
zwol
@zwol oh? No lo sabia. Es bueno saberlo.
Nathan Osman
@zwol No es de un cmdshell ... F:\test>md \\?\f:\test\<test> La sintaxis del comando es incorrecta.
DavidPostill
@DavidPostill ¿Qué pasa md \\^?\f:\test\^<test^>?
zwol
11
La respuesta de DavidPostill es excelente, pero puede confundir un poco a los recién llegados. Trataré de reformular.
%No es un personaje reservado .
Es un personaje con un significado especial para el shell de comandos (también conocido como cmd.exey command.com)
La diferencia es:
no puede usar caracteres reservados en absoluto (pero vea a continuación)
es posible que pueda usar caracteres especiales y de escape, simplemente no escribiéndolos tal cual
En otras palabras, puede crear un archivo o carpeta que contenga %su nombre. Puede hacerlo directamente usando el explorador de Windows porque %no tiene un significado especial allí. Tampoco hubo intención de evitar que creara dichos archivos en el símbolo del sistema, pero debido a que %tiene un significado especial allí, debe usar la sintaxis que se describe a continuación para crear dichos archivos.
Archivos BAT
Si está escribiendo un archivo por lotes (* .bat, * .cmd), que se ejecuta mediante el shell de comandos (también conocido como la aplicación del símbolo del sistema), para usarlo %literalmente (como crear un archivo con %el nombre y no sustituirlo). una variable o parámetro) necesita escribir en su %%lugar.
Por ejemplo,
comando echo %windir%produce salida:c:\windows
sin embargo, el comando echo %%windir%%produce salida:%windir%
y así sucesivamente: el comando echo %%%%windir%%%%produce salida:%%windir%%
Entonces, si guarda la siguiente línea como test.baty la ejecuta, creará un directorio llamado %test%completo con signos de porcentaje:
md %%test%%
Si no hay una variable nombrada test, este siguiente comando es equivalente al último, también crea un directorio %test%:
md %test%
... pero por favor nunca lo haga así, ya que su comando no se comportará de la manera deseada una vez que alguien cree una variable con ese nombre
Si tiene la intención de usar el comando foren un archivo BAT, también debe duplicarlo %para que tenga un significado especial para el forcomando en lugar del comando en sí mismo:
for %%i in (*.*) do echo %%i
Esto producirá una lista de archivos en el directorio actual (es decir, %%itiene un significado especial), y no estoy seguro de cómo hacer que produzca literalmente %%isin recurrir a la %p%solución descrita en la siguiente sección ( %%%%ino funciona aquí).
%no es el único personaje con un significado especial en el símbolo del sistema. Otros incluyen ^, <, >, |, (, ), &, !, ". La mayoría de ellos (excluyendo ") se pueden escapar , es decir, con el prefijo de un carácter de escape ^para que se inserte un carácter literal, suprimiendo su significado especial. Los que también pierden su función especial dentro de la cadena doublequoted, y "se escapó con una barra invertida: \". Es ^posible que sea necesario duplicar algunos carets ( ) dentro de una cadena encerrada entre comillas dobles y donde tenga lugar la sustitución de variables retrasadas ( !significado especial).
Símbolo del sistema
Desafortunadamente, al escribir comandos en la ventana del símbolo del sistema directamente, el %carácter de duplicación solo produce, %%es decir, el enfoque anterior no funciona en ese caso.
Parece que hay una solución para explotar una peculiaridad en el procesamiento de comandos: puede obtener literal %escribiendo ^después %. Sin embargo, ese enfoque no es infalible: si su nombre de archivo está entre comillas dobles, ^se interpreta literalmente (y no se elimina como sin comillas)
comando echo %windir%produce salida:c:\windows
comando echo %^windir%produce salida:%windir%
comando echo "%^windir%"produce salida: "%^windir%"(con extra ^- no es lo que queríamos)
Recomiendo otra solución alternativa en su lugar:
crear una variable como esta: set "p=%"
use %p%donde sea que necesite un signo de porcentaje literal: echo "%p%windir%p%"ahora producirá salida:"%windir%"
Se puede usar la misma solución para obtener el forcomando de inicio de sesión de porcentaje literal , sin embargo, tenga en cuenta que, a diferencia de los archivos BAT, cuando se ingresa el forcomando directamente, no se duplican los signos de porcentaje.
Caracteres reservados del sistema de archivos
Normalmente no puede crear un archivo o directorio que contenga los siguientes caracteres reservados en su nombre:, /?<>\:*|"símbolo NULL y caracteres con los códigos 1 a 31; también .y el espacio no puede ser el último personaje; y siguientes nombres son ilegales: com1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9connulprn.
Sin embargo, algunas de estas restricciones se pueden omitir el prefijo de ruta de archivo con \\?\la siguiente manera: \\?\c:\test...\nul. Al menos los archivos con nombres reservados y los que terminan con espacio y punto pueden manipularse de esa manera.
Además, el propio sistema de archivos NTFS admite varios subsistemas de nombres: DOS, Windows y POSIX. Es el subsistema de Windows que tiene todas las restricciones anteriores, mientras que POSIX solo prohíbe /y el símbolo NULL.
El sistema operativo GNU / Linux (un superconjunto de POSIX) puede crear (y eliminar) nombres de archivo / directorio con los que la mayoría de las funciones normales de la API de Windows (y, por lo tanto, los programas de Windows) no pueden funcionar. En Windows XP, trabajar con ellos fue posible mediante la instalación gratuita de "Servicios para el subsistema Unix" (SFU); en Vista y superior, se requieren herramientas de terceros para eso. No estoy seguro de si el nuevo subsistema ubuntu-on-windows10 puede hacerlo.
¿Por qué utiliza etiquetas de teclado para nombres de ruta / comando? Sería sintácticamente más correcto y más legible si solo utilizara el formato de código en línea. También sería más fácil escribir: una tecla de retroceso en lugar de <kbd>.
Cody Gray
hecho. Pensé que las <kbd> etiquetas </kbd> tenían un esquema mucho más claro que code blocks. Pero si surgiera tal pregunta, supongo que causan confusión.
Jack White
2
"Es un símbolo de escape del comando shell" No es correcto. El carácter de escape en cmd es ^. %es "un carácter que tiene un significado especial para los parámetros de la línea de comandos y los parámetros FOR. Para tratar un porcentaje como un carácter regular, duplíquelo".
DavidPostill
De hecho, tenía los términos mezclados. Ahora corrigió la respuesta. Gracias.
Jack White
También tenga en cuenta, como se indica en mi respuesta, sólo se doble %en forcaso de que forestá dentro de un archivo por lotes. Al escribir for %%i in (*) do echo %%ien una ventana de comando, se produce un error que cita la aparición inapropiada de %%i.
<test>
. Simplemente no se puede hacer usando las funciones de administración de archivos de Windows.\\?\C:\USERS\DEFAULT\<test>
).cmd
shell ...F:\test>md \\?\f:\test\<test>
La sintaxis del comando es incorrecta.md \\^?\f:\test\^<test^>
?La respuesta de DavidPostill es excelente, pero puede confundir un poco a los recién llegados. Trataré de reformular.
%
No es un personaje reservado .Es un personaje con un significado especial para el shell de comandos (también conocido como
cmd.exe
ycommand.com
)La diferencia es:
En otras palabras, puede crear un archivo o carpeta que contenga
%
su nombre. Puede hacerlo directamente usando el explorador de Windows porque%
no tiene un significado especial allí. Tampoco hubo intención de evitar que creara dichos archivos en el símbolo del sistema, pero debido a que%
tiene un significado especial allí, debe usar la sintaxis que se describe a continuación para crear dichos archivos.Archivos BAT
Si está escribiendo un archivo por lotes (* .bat, * .cmd), que se ejecuta mediante el shell de comandos (también conocido como la aplicación del símbolo del sistema), para usarlo
%
literalmente (como crear un archivo con%
el nombre y no sustituirlo). una variable o parámetro) necesita escribir en su%%
lugar.Por ejemplo,
echo %windir%
produce salida:c:\windows
echo %%windir%%
produce salida:%windir%
echo %%%%windir%%%%
produce salida:%%windir%%
Entonces, si guarda la siguiente línea como
test.bat
y la ejecuta, creará un directorio llamado%test%
completo con signos de porcentaje:Si no hay una variable nombrada
test
, este siguiente comando es equivalente al último, también crea un directorio%test%
:... pero por favor nunca lo haga así, ya que su comando no se comportará de la manera deseada una vez que alguien cree una variable con ese nombre
Si tiene la intención de usar el comando
for
en un archivo BAT, también debe duplicarlo%
para que tenga un significado especial para elfor
comando en lugar del comando en sí mismo:Esto producirá una lista de archivos en el directorio actual (es decir,
%%i
tiene un significado especial), y no estoy seguro de cómo hacer que produzca literalmente%%i
sin recurrir a la%p%
solución descrita en la siguiente sección (%%%%i
no funciona aquí).%
no es el único personaje con un significado especial en el símbolo del sistema. Otros incluyen^
,<
,>
,|
,(
,)
,&
,!
,"
. La mayoría de ellos (excluyendo"
) se pueden escapar , es decir, con el prefijo de un carácter de escape^
para que se inserte un carácter literal, suprimiendo su significado especial. Los que también pierden su función especial dentro de la cadena doublequoted, y"
se escapó con una barra invertida:\"
. Es^
posible que sea necesario duplicar algunos carets ( ) dentro de una cadena encerrada entre comillas dobles y donde tenga lugar la sustitución de variables retrasadas (!
significado especial).Símbolo del sistema
Desafortunadamente, al escribir comandos en la ventana del símbolo del sistema directamente, el
%
carácter de duplicación solo produce,%%
es decir, el enfoque anterior no funciona en ese caso.Parece que hay una solución para explotar una peculiaridad en el procesamiento de comandos: puede obtener literal
%
escribiendo^
después%
. Sin embargo, ese enfoque no es infalible: si su nombre de archivo está entre comillas dobles,^
se interpreta literalmente (y no se elimina como sin comillas)echo %windir%
produce salida:c:\windows
echo %^windir%
produce salida:%windir%
echo "%^windir%"
produce salida:"%^windir%"
(con extra^
- no es lo que queríamos)Recomiendo otra solución alternativa en su lugar:
set "p=%"
%p%
donde sea que necesite un signo de porcentaje literal:echo "%p%windir%p%"
ahora producirá salida:"%windir%"
Se puede usar la misma solución para obtener el
for
comando de inicio de sesión de porcentaje literal , sin embargo, tenga en cuenta que, a diferencia de los archivos BAT, cuando se ingresa elfor
comando directamente, no se duplican los signos de porcentaje.Caracteres reservados del sistema de archivos
Normalmente no puede crear un archivo o directorio que contenga los siguientes caracteres reservados en su nombre:,
/
?
<
>
\
:
*
|
"
símbolo NULL y caracteres con los códigos 1 a 31; también.
y el espacio no puede ser el último personaje; y siguientes nombres son ilegales:com1
com2
com3
com4
com5
com6
com7
com8
com9
lpt1
lpt2
lpt3
lpt4
lpt5
lpt6
lpt7
lpt8
lpt9
con
nul
prn
.Sin embargo, algunas de estas restricciones se pueden omitir el prefijo de ruta de archivo con
\\?\
la siguiente manera:\\?\c:\test...\nul
. Al menos los archivos con nombres reservados y los que terminan con espacio y punto pueden manipularse de esa manera.Además, el propio sistema de archivos NTFS admite varios subsistemas de nombres: DOS, Windows y POSIX. Es el subsistema de Windows que tiene todas las restricciones anteriores, mientras que POSIX solo prohíbe
/
y el símbolo NULL.El sistema operativo GNU / Linux (un superconjunto de POSIX) puede crear (y eliminar) nombres de archivo / directorio con los que la mayoría de las funciones normales de la API de Windows (y, por lo tanto, los programas de Windows) no pueden funcionar. En Windows XP, trabajar con ellos fue posible mediante la instalación gratuita de "Servicios para el subsistema Unix" (SFU); en Vista y superior, se requieren herramientas de terceros para eso. No estoy seguro de si el nuevo subsistema ubuntu-on-windows10 puede hacerlo.
fuente
<kbd>
.code blocks
. Pero si surgiera tal pregunta, supongo que causan confusión.^
.%
es "un carácter que tiene un significado especial para los parámetros de la línea de comandos y los parámetros FOR. Para tratar un porcentaje como un carácter regular, duplíquelo".%
enfor
caso de quefor
está dentro de un archivo por lotes. Al escribirfor %%i in (*) do echo %%i
en una ventana de comando, se produce un error que cita la aparición inapropiada de%%i
.