In Esplora risorse, perché possiamo creare una cartella o un file con il simbolo percentuale (%), se il simbolo percentuale viene utilizzato per le variabili esistenti?


13
  1. Vai a Esplora risorse e creare una cartella / directory di nome %systemdrive%, %windir%o qualsiasi altra variabile esistente.
  2. Apri un prompt dei comandi e vai alla cartella che hai appena creato.

Non puoi, perché ci sono %simboli percent ( ) nel nome della cartella, confondendo il prompt dei comandi, perché il simbolo percentuale viene utilizzato per le variabili esistenti.

L'escape del %simbolo percent ( ) con due simboli percentuali ( %%) non funziona, quindi la risposta di DavidPostill è errata:

Finestra del prompt dei comandi, con un po 'di desktop Explorer che mostra Quindi, in Windows Explorer, perché possiamo creare una cartella o un file con il %simbolo percentuale ( ), se il simbolo percentuale viene utilizzato per le variabili esistenti?

Risposte:


16

Perché possiamo creare una cartella / file con il simbolo percentuale?

Il %carattere non è un carattere riservato nel nome di un file.

I caratteri riservati per denominare file, percorsi e spazi dei nomi sono:

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

File di denominazione di origine , percorsi e spazi dei nomi


Il simbolo percentuale è riservato alle variabili

Ora, apri un prompt dei comandi e prova ad andare alla cartella che hai creato.

Non puoi, perché ci sono simboli percentuali nel nome della cartella, a indicare che si tratta di una variabile.

Quanto sopra non è vero. Tutto funziona esattamente come ti aspetteresti.

Esempio usando %test%:

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

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Esempio 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

Percentuale di escape

Il %carattere ha un significato speciale per i parametri e i FORparametri della riga di comando .

Per considerare una percentuale come un personaggio normale, raddoppiala:

%%

Sintassi della fonte


Ulteriori letture


1
Nota: non tutti i caratteri riservati si applicano al filesystem NTFS. Usando Linux, per esempio, posso facilmente creare un file chiamato <test>. Semplicemente non può essere fatto utilizzando le funzioni di gestione dei file di Windows.
Nathan Osman,

2
@NathanOsman Potresti essere in grado di creare file con quei nomi da Windows usando la notazione del percorso assoluto grezzo ( \\?\C:\USERS\DEFAULT\<test>).
zwol,

@zwol oh? Non lo sapevo. Buono a sapersi.
Nathan Osman,

@zwol Non da una cmdshell ... F:\test>md \\?\f:\test\<test> La sintassi del comando non è corretta.
DavidPostill

@DavidPostill Che dire md \\^?\f:\test\^<test^>?
zwol,

11

La risposta di DavidPostill è ottima, ma può confondere un po 'i nuovi arrivati. Proverò a riformulare.

% non è un personaggio riservato .

È un personaggio con un significato speciale per la shell dei comandi (alias cmd.exee command.com)

La differenza è:

  • non puoi usare affatto caratteri riservati (ma vedi sotto)
  • potresti essere in grado di usare caratteri speciali e di escape - semplicemente non digitandoli così come sono

In altre parole, è possibile creare un file o una cartella contenente il %loro nome. Puoi farlo direttamente utilizzando Windows Explorer perché %non ha un significato speciale lì. Non c'era intenzione di impedirti di creare tali file al prompt dei comandi, ma perché% ha un significato speciale, è necessario utilizzare la sintassi descritta di seguito per creare tali file.

BAT-files

Se stai scrivendo un file batch (* .bat, * .cmd), che viene eseguito dalla shell dei comandi (alias l'applicazione del prompt dei comandi), da usare %letteralmente (come per creare un file con %nel nome e non sostituire una variabile o un parametro) è necessario digitare%% invece.

Per esempio,

  • il comando echo %windir%produce output:c:\windows
  • tuttavia, il comando echo %%windir%%produce output:%windir%
  • e così via: il comando echo %%%%windir%%%%produce output:%%windir%%

Quindi, se salvi la seguente riga come test.bated eseguila, creerà una directory denominata %test%completa con segni di percentuale:

md %%test%%

Se non vi è alcuna variabile denominata test, questo comando successivo è equivalente all'ultimo - crea anche una directory %test%:

md %test%

... ma per favore non farlo mai così poiché il tuo comando non si comporterà come desiderato una volta che qualcuno crea una variabile con quel nome

Se si intende utilizzare il comando forin un file BAT, è necessario raddoppiare in %modo che abbia un significato speciale da forcomandare anziché per la shell dei comandi stessa:

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

Questo produrrà un elenco di file nella directory corrente (ovvero, %%iha un significato speciale) e non sono sicuro di come farlo produrre letteralmente %%isenza ricorrere alla %p%soluzione alternativa descritta nella sezione successiva ( %%%%inon funziona qui).

%non è l'unico carattere con un significato speciale al prompt dei comandi. Altri includono ^, <, >, |, (, ), &, !, ". La maggior parte di quelli (esclusi ") possono essere sfuggiti , cioè prefissati con un carattere di fuga in ^modo da inserire un carattere letterale, sopprimendone il significato speciale. Coloro che perdono anche la loro funzione speciale all'interno della stringa doublequoted, e "è fuggito con un backslash: \". Potrebbe ^essere necessario raddoppiare alcuni punti di inserimento ( ) all'interno di una stringa racchiusa tra virgolette doppie e in cui ha luogo la sostituzione ritardata delle variabili ( !significato speciale).

Prompt dei comandi

Sfortunatamente, quando si digitano direttamente i comandi nella finestra del prompt dei comandi, il raddoppio del %carattere produce semplicemente, %%cioè l'approccio sopra non funziona in quel caso.

Sembra esserci una soluzione alternativa che sfrutta una stranezza nell'elaborazione dei comandi: puoi ottenere letterale %digitando ^dopo %. Questo approccio non è infallibile però: se il tuo nome file è racchiuso tra virgolette doppie, ^viene interpretato letteralmente (e non rimosso come senza virgolette)

  • il comando echo %windir%produce output:c:\windows
  • il comando echo %^windir%produce output:%windir%
  • il comando echo "%^windir%"produce output: "%^windir%"(con extra ^- non quello che volevamo)

Consiglio invece un'altra soluzione alternativa:

  • crea una variabile come questa: set "p=%"
  • utilizzare %p%ovunque sia necessario un segno di percentuale letterale: echo "%p%windir%p%"ora produrrà output:"%windir%"

La stessa soluzione alternativa può essere utilizzata per ottenere il forcomando di accesso letterale in percentuale , tuttavia notare che diversamente dai file BAT quando si digita fordirettamente il comando non si raddoppiano i segni di percentuale.

Caratteri riservati del filesystem

Normalmente non è possibile creare un file o una directory contenente i seguenti caratteri riservati nel suo nome / ? < > \ : * | ":, simbolo NULL e caratteri con i codici da 1 a 31; inoltre .e lo spazio non può essere l'ultimo carattere; e i seguenti nomi sono illegali:com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn .

Tuttavia, alcune di queste restrizioni possono essere aggirate prefissando il percorso del file in \\?\questo modo:\\?\c:\test...\nul . Almeno i file con nomi riservati e quelli che terminano con spazio e punto possono essere manipolati in questo modo.

Inoltre, il filesystem NTFS stesso supporta diversi sottosistemi di denominazione: DOS, Windows e POSIX. È il sottosistema Windows che ha tutte le restrizioni di cui sopra, mentre POSIX proibisce solo/ simbolo NULL.

Il sistema operativo GNU / Linux (un superset di POSIX) può quindi creare (ed eliminare) nomi di file / directory con cui la maggior parte delle normali funzioni API di Windows (e quindi i programmi Windows) non possono funzionare. Su Windows XP è stato possibile lavorare con loro installando il sottosistema gratuito "Servizi per Unix" (SFU); su Vista e sopra sono richiesti strumenti di terze parti. Non sono sicuro che il nuovo sottosistema ubuntu-on-windows10 possa farlo.


Perché usi i tag della tastiera per i nomi di percorso / comando? Sarebbe sia sintatticamente più corretto e più leggibile se hai appena usato la formattazione del codice in linea. Sarebbe anche più facile digitare: un backtick invece di <kbd>.
Cody Gray,

fatto. Pensavo che i <kbd> tag </kbd> avessero una struttura molto più chiara di code blocks. Ma se sorgesse una domanda del genere, suppongo che causino confusione.
Jack White,

2
"È un simbolo di escape della shell dei comandi" Non corretto. Il carattere di escape in cmd è ^. %è "un carattere che ha un significato speciale per i parametri della riga di comando e i parametri FOR. Per trattare una percentuale come un carattere normale, raddoppia".
DavidPostill

Anzi, avevo i termini confusi. Ora corretta la risposta. Grazie.
Jack White,

Si prega inoltre di nota, come indicato nella mia risposta, è solo il doppio %in forse che forè all'interno di un file batch. Digitare for %%i in (*) do echo %%iin una finestra di comando propmt produce un errore che cita l'aspetto non appropriato di %%i.
Jack White,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.