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
Wechseln Sie zu Windows Explorer, und erstellen Sie einen Ordner / Verzeichnis mit dem Namen %systemdrive%, %windir%oder jede andere vorhandene Variable.
Ö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:
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?
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: com1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9connulprn.
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.
<test>
. Mit den Dateiverwaltungsfunktionen von Windows ist dies einfach nicht möglich.\\?\C:\USERS\DEFAULT\<test>
) erstellen .cmd
Shell ...F:\test>md \\?\f:\test\<test>
Die Syntax des Befehls ist falsch.md \\^?\f:\test\^<test^>
?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.exe
undcommand.com
).Der Unterschied ist:
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,
echo %windir%
erzeugt Ausgabe:c:\windows
echo %%windir%%
erzeugt jedoch Ausgabe:%windir%
echo %%%%windir%%%%
erzeugt Ausgabe:%%windir%%
Wenn Sie also die folgende Zeile speichern
test.bat
und ausführen, wird ein Verzeichnis%test%
mit Prozentzeichen erstellt:Wenn keine Variable benannt ist
test
, entspricht dieser nächste Befehl dem letzten - es wird auch ein Verzeichnis erstellt%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
for
in einer BAT-Datei verwenden%
möchten, müssen Sie ihn auch verdoppeln, damit erfor
anstelle der Befehlsshell selbst eine besondere Bedeutung hat:Dadurch wird eine Liste der Dateien im aktuellen Verzeichnis erstellt (das heißt, sie haben
%%i
eine besondere Bedeutung), und ich bin nicht sicher, wie ich sie%%i
ohne%p%
die im nächsten Abschnitt beschriebene Problemumgehung als Literal erstellen kann (%%%%i
funktioniert 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).echo %windir%
erzeugt Ausgabe:c:\windows
echo %^windir%
erzeugt Ausgabe:%windir%
echo "%^windir%"
erzeugt Ausgabe:"%^windir%"
(mit extra^
- nicht was wir wollten)Ich empfehle stattdessen eine andere Problemumgehung:
set "p=%"
%p%
Sie diese Option, wo immer Sie ein Prozentzeichen benötigen: Esecho "%p%windir%p%"
wird nun Folgendes ausgegeben:"%windir%"
Dieselbe Problemumgehung kann verwendet werden, um einen wörtlichen Prozentzeichen-Anmeldebefehl
for
abzurufen. Beachten Sie jedoch, dass Sie im Gegensatz zu BAT-Dateien beimfor
direkten 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.
quelle
<kbd>
.code blocks
. Aber wenn eine solche Frage auftaucht, sorgen sie wohl für Verwirrung.^
.%
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".%
in ,for
wenn dasfor
ist in einer Batch - Datei. Dasfor %%i in (*) do echo %%i
Eingeben in ein Befehlsfenster führt zu einem Fehler, der das unpassende Erscheinungsbild von angibt%%i
.