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
  1. Vaya al Explorador de Windows, y crear una carpeta / directorio llamado %systemdrive%, %windir%o cualquier otra variable existente.
  2. 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:

Ventana de símbolo del sistema, con un poco del escritorio del Explorador mostrando 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?

The Tech Guy
fuente

Respuestas:

16

¿Por qué podemos crear una carpeta / archivo con el símbolo de porcentaje?

El %carácter no es un carácter reservado en un nombre de archivo.

Los caracteres reservados para nombrar archivos, rutas y espacios de nombres son:

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

Archivos de nombres de origen , rutas y espacios de nombres


El símbolo de porcentaje está reservado para variables

Ahora, abra un símbolo del sistema e intente ir a la carpeta que creó.

No puede, porque hay símbolos de porcentaje en el nombre de la carpeta, lo que indica que es una variable.

Lo anterior no es cierto. Todo funciona exactamente como es de esperar.

Ejemplo usando %test%:

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

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Ejemplo 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

Porcentajes de escape

El %carácter tiene un significado especial para los parámetros y FORparámetros de la línea de comando .

Para tratar un porcentaje como un carácter regular, duplíquelo:

%%

Sintaxis de origen


Otras lecturas

DavidPostill
fuente
1
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: 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.

Jack White
fuente
¿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.
Jack White