Warum können wir in Windows Explorer einen Ordner oder eine Datei mit dem Prozentzeichen (%) erstellen, wenn das Prozentzeichen für vorhandene Variablen verwendet wird?


13
  1. Wechseln Sie zu Windows Explorer, und erstellen Sie einen Ordner / Verzeichnis mit dem Namen %systemdrive%, %windir%oder jede andere vorhandene Variable.
  2. Öffnen Sie eine Eingabeaufforderung und wechseln Sie zu dem gerade erstellten Ordner.

Dies ist nicht möglich, da %der Ordnername Prozentzeichen ( ) enthält, was die Eingabeaufforderung verwirrt, da das Prozentzeichen für vorhandene Variablen verwendet wird.

Es funktioniert nicht, das Prozentzeichen ( %) mit zwei Prozentzeichen ( %%) zu maskieren, daher ist die Antwort von DavidPostill falsch:

Eingabeaufforderungsfenster, in dem ein Teil des Explorer-Desktops angezeigt wird Warum können wir in Windows Explorer einen Ordner oder eine Datei mit dem Prozentzeichen ( %) erstellen , wenn das Prozentzeichen für vorhandene Variablen verwendet wird?

Antworten:


16

Warum können wir einen Ordner / eine Datei mit dem Prozentzeichen erstellen?

Das %Zeichen ist kein reserviertes Zeichen in einem Dateinamen.

Die reservierten Zeichen zum Benennen von Dateien, Pfaden und Namespaces sind:

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

Quellennamensdateien , Pfade und Namespaces


Das Prozentzeichen ist für Variablen reserviert

Öffnen Sie nun eine Eingabeaufforderung und versuchen Sie, zu dem von Ihnen erstellten Ordner zu wechseln.

Dies ist nicht möglich, da der Ordnername Prozentzeichen enthält, die darauf hinweisen, dass es sich um eine Variable handelt.

Das obige ist nicht wahr. Alles funktioniert so, wie Sie es erwarten würden.

Beispiel mit %test%:

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

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Beispiel mit %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

Flucht vor Prozenten

Das %Zeichen hat eine besondere Bedeutung für Befehlszeilenparameter und FORParameter.

Um ein Prozent als reguläres Zeichen zu behandeln, verdoppeln Sie es:

%%

Quelle Syntax


Weitere Lektüre


1
Hinweis: Nicht alle reservierten Zeichen gelten für das NTFS-Dateisystem. Unter Linux kann ich zum Beispiel leicht eine Datei mit dem Namen erstellen <test>. Mit den Dateiverwaltungsfunktionen von Windows ist dies einfach nicht möglich.
Nathan Osman

2
@ NathanOsman Möglicherweise können Sie Dateien mit diesen Namen in Windows mithilfe der absoluten Pfadnotation ( \\?\C:\USERS\DEFAULT\<test>) erstellen .
zwol

@zwol oh? Ich wusste das nicht. Das ist gut zu wissen.
Nathan Osman

@zwol Nicht aus einer cmdShell ... F:\test>md \\?\f:\test\<test> Die Syntax des Befehls ist falsch.
DavidPostill

@ DavidPostill Was ist mit md \\^?\f:\test\^<test^>?
zwol

11

Die Antwort von DavidPostill ist großartig, kann aber Neulinge ein wenig verwirren. Ich werde versuchen, es anders zu formulieren.

%ist kein reserviertes Zeichen.

Es ist ein Zeichen mit besonderer Bedeutung für die Befehlsshell (auch bekannt als cmd.exeund command.com).

Der Unterschied ist:

  • Sie können keine reservierten Zeichen verwenden (siehe unten)
  • Möglicherweise können Sie Sonder- und Escape-Zeichen verwenden - nur nicht, indem Sie sie so wie sie sind eingeben

Mit anderen Worten, Sie können eine Datei oder einen Ordner erstellen, die bzw. der %ihren Namen enthält. Sie können dies direkt mit dem Windows Explorer tun, da er %dort keine besondere Bedeutung hat. Es war auch nicht beabsichtigt, Sie daran zu hindern, solche Dateien an der Eingabeaufforderung %zu erstellen. Da diese Dateien jedoch eine besondere Bedeutung haben, müssen Sie zum Erstellen solcher Dateien die unten beschriebene Syntax verwenden.

BAT-Dateien

Wenn Sie eine Batch-Datei (* .bat, * .cmd) schreiben , die von der Befehlsshell (auch als Eingabeaufforderungsanwendung bezeichnet) ausgeführt wird, verwenden Sie sie %wörtlich (z. B. um eine Datei mit %dem Namen zu erstellen , und nicht um sie zu ersetzen) Sie müssen %%stattdessen eine Variable oder einen Parameter eingeben.

Beispielsweise,

  • Befehl echo %windir%erzeugt Ausgabe:c:\windows
  • Befehl echo %%windir%%erzeugt jedoch Ausgabe:%windir%
  • und so weiter: Befehl echo %%%%windir%%%%erzeugt Ausgabe:%%windir%%

Wenn Sie also die folgende Zeile speichern test.batund ausführen, wird ein Verzeichnis %test%mit Prozentzeichen erstellt:

md %%test%%

Wenn keine Variable benannt ist test, entspricht dieser nächste Befehl dem letzten - es wird auch ein Verzeichnis erstellt %test%:

md %test%

... aber bitte machen Sie das nie so, da Ihr Befehl sich nicht so verhält, wie Sie es wollten, wenn jemand eine Variable mit diesem Namen erstellt

Wenn Sie den Befehl forin einer BAT-Datei verwenden %möchten, müssen Sie ihn auch verdoppeln, damit er foranstelle der Befehlsshell selbst eine besondere Bedeutung hat:

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

Dadurch wird eine Liste der Dateien im aktuellen Verzeichnis erstellt (das heißt, sie haben %%ieine besondere Bedeutung), und ich bin nicht sicher, wie ich sie %%iohne %p%die im nächsten Abschnitt beschriebene Problemumgehung als Literal erstellen kann ( %%%%ifunktioniert hier nicht).

%ist nicht das einzige Zeichen mit besonderer Bedeutung an der Eingabeaufforderung. Andere schließen ^, <, >, |, (, ), &, !, ". Die meisten dieser Zeichen (mit Ausnahme von ") können maskiert werden, d. H. Mit einem Escape-Zeichen als Präfix, ^sodass ein Literalzeichen eingefügt wird, das seine spezielle Bedeutung unterdrückt. Diejenigen , auch ihre besondere Funktion innerhalb doublequoted String verlieren, und "ist mit einem Backslash: \". Einige Carets ( ^) müssen möglicherweise in einem String mit doppelten Anführungszeichen verdoppelt werden, und wenn eine verzögerte Variablensubstitution stattfindet ( !besondere Bedeutung).

Eingabeaufforderung

Wenn Sie Befehle direkt in das Eingabeaufforderungsfenster eingeben, führt das Verdoppeln von %Zeichen leider nur dazu, dass %%der oben beschriebene Ansatz in diesem Fall nicht funktioniert.

Es scheint eine Krücke , um eine Marotte in Befehlsverarbeitung zu nutzen - Sie wörtliche bekommen können %durch Eingabe ^nach %. Dieser Ansatz ist jedoch nicht kinderleicht: Wenn Ihr Dateiname in doppelte Anführungszeichen eingeschlossen ist, ^wird er wörtlich interpretiert (und nicht wie ohne Anführungszeichen entfernt).

  • Befehl echo %windir%erzeugt Ausgabe:c:\windows
  • Befehl echo %^windir%erzeugt Ausgabe:%windir%
  • Befehl echo "%^windir%"erzeugt Ausgabe: "%^windir%"(mit extra ^- nicht was wir wollten)

Ich empfehle stattdessen eine andere Problemumgehung:

  • Erstelle eine Variable wie folgt: set "p=%"
  • Verwenden %p%Sie diese Option, wo immer Sie ein Prozentzeichen benötigen: Es echo "%p%windir%p%"wird nun Folgendes ausgegeben:"%windir%"

Dieselbe Problemumgehung kann verwendet werden, um einen wörtlichen Prozentzeichen-Anmeldebefehl forabzurufen. Beachten Sie jedoch, dass Sie im Gegensatz zu BAT-Dateien beim fordirekten Eingeben des Befehls keine doppelten Prozentzeichen verwenden.

Reservierte Zeichen im Dateisystem

Normalerweise können Sie keine Datei oder kein Verzeichnis erstellen, deren Name die folgenden reservierten Zeichen enthält / ? < > \ : * | ":, NULL-Symbol und Zeichen mit den Codes 1 bis 31; auch .und Leerzeichen dürfen keine letzten Zeichen sein; und folgende Namen sind illegal: com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn.

Doch einige können diese Einschränkungen umgangen werden Dateipfad voran mit \\?\wie folgt aus : \\?\c:\test...\nul. Zumindest Dateien mit reservierten Namen und solche, die mit Leerzeichen und Punkten enden, können auf diese Weise bearbeitet werden.

Darüber hinaus unterstützt das NTFS-Dateisystem selbst mehrere Benennungssubsysteme: DOS, Windows und POSIX. Es ist das Windows-Subsystem, das alle oben genannten Einschränkungen aufweist, während POSIX nur verbietet /und ein NULL-Symbol verwendet.

GNU / Linux OS (eine Obermenge von POSIX) kann daher Datei- / Verzeichnisnamen erstellen (und löschen), mit denen die meisten normalen Windows-API-Funktionen (und daher Windows-Programme) nicht arbeiten können. Unter Windows XP war es möglich, mit ihnen zu arbeiten, indem das kostenlose "Services For Unix-Subsystem" (SFU) installiert wurde. Unter Vista und höher sind hierfür Tools von Drittanbietern erforderlich. Ich bin mir nicht sicher, ob das neue Subsystem Ubuntu-on-Windows10 das kann.


Warum verwenden Sie Tastaturbefehle für Pfad- / Befehlsnamen? Es wäre sowohl syntaktisch korrekter als auch lesbarer, wenn Sie nur die Inline-Code-Formatierung verwenden würden. Es wäre auch einfacher zu tippen: ein Backtick statt <kbd>.
Cody Grey

erledigt. Ich dachte, dass <kbd> Tags </ kbd> eine viel klarere Gliederung haben als code blocks. Aber wenn eine solche Frage auftaucht, sorgen sie wohl für Verwirrung.
Jack White

2
"Es ist ein Escape-Symbol der Befehlsshell" Nicht korrekt. Die Escape - Zeichen in cmd ist ^. %ist "ein Zeichen, das eine besondere Bedeutung für Befehlszeilenparameter und FOR-Parameter hat. Um ein Prozent als reguläres Zeichen zu behandeln, verdoppeln Sie es".
DavidPostill

In der Tat hatte ich die Begriffe verwechselt. Nun korrigiert die Antwort. Vielen Dank.
Jack White

Bitte beachten Sie auch, wie in meiner Antwort dargelegt, nur doppelt %in , forwenn das forist in einer Batch - Datei. Das for %%i in (*) do echo %%iEingeben in ein Befehlsfenster führt zu einem Fehler, der das unpassende Erscheinungsbild von angibt %%i.
Jack White
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.