Unter Unix konnte ich laufen myscript '"test"'
und ich würde bekommen "test"
.
In Windows cmd
bekomme ich 'test'
.
Wie kann ich doppelte Anführungszeichen als Parameter übergeben? Ich möchte wissen, wie dies manuell aus einem cmd
Fenster heraus gemacht wird, damit ich kein Programm schreiben muss, um mein Programm zu testen.
myscript \"test\"
Antworten:
Ich kann die Symptome nicht schnell reproduzieren: Wenn ich es
myscript '"test"'
mit einer Batch-Datei versuche,myscript.bat
die nur@echo.%1
oder sogar enthält@echo.%~1
, erhalte ich alle Angebote:'"test"'
Vielleicht können Sie den Fluchtcharakter so ausprobieren
^
:myscript '^"test^"'
?quelle
wscript
die Schuld ist! Überlassen Sie es Windows :)cmd
.Eine andere Möglichkeit, Anführungszeichen zu umgehen (obwohl dies wahrscheinlich nicht vorzuziehen ist), die ich an bestimmten Stellen verwendet habe, besteht darin , mehrere doppelte Anführungszeichen zu verwenden . Um den Code anderer Leute lesbar zu machen, werde ich erklären.
Hier sind einige Grundregeln:
program param1 param2 param 3
wird auf vier Parameter übergebenprogram.exe
:param1
,param2
,param
, und3
.program one two "three and more"
werden drei Parameter übergebenprogram.exe
:one
,two
, undthree and more
.hello"to the entire"world
fungiert als ein Parameter :helloto the entireworld
."Tim says, ""Hi!"""
fungiert als ein Parameter:Tim says, "Hi!"
Daher gibt es drei verschiedene Arten von doppelten Anführungszeichen: Anführungszeichen, die geöffnet werden, Anführungszeichen, die geschlossen werden, und Anführungszeichen, die als Klartext fungieren.
Hier ist die Aufschlüsselung dieser letzten verwirrenden Zeile:
Somit verbindet der Text effektiv vier Gruppen von Zeichen (eine mit nichts jedoch):
Tim says,
ist die erste, umbrochen, um den Leerzeichen zu entkommen,"Hi!
ist die zweite, nicht umbrochen (es gibt keine Leerzeichen)ist die dritte, eine Gruppe in doppelten Anführungszeichen, die nichts umschließt
"
ist das vierte, das ausgepackte enge Zitat.Wie Sie sehen können, ist die Gruppe mit doppelten Anführungszeichen immer noch nicht erforderlich, da ohne sie das folgende doppelte Anführungszeichen eine Gruppe mit doppelten Anführungszeichen öffnen würde, anstatt als Klartext zu fungieren.
Daraus sollte ersichtlich sein, dass daher innerhalb und außerhalb von Anführungszeichen drei doppelte Anführungszeichen als nicht entflohenes einfaches Anführungszeichen im Klartext fungieren:
wird
Tim said to him, "What's been happening lately?"
wie erwartet gedruckt . Daher können drei Anführungszeichen immer zuverlässig als Flucht verwendet werden.Wenn Sie es jedoch verstehen, können Sie feststellen, dass die vier Anführungszeichen am Ende auf nur zwei reduziert werden können, da technisch eine weitere unnötige leere Gruppe mit doppelten Anführungszeichen hinzugefügt wird.
Hier sind einige Beispiele, um es abzuschließen:
Schlussbemerkung: Ich habe nichts davon aus einem Tutorial gelesen - ich habe alles durch Experimentieren gefunden. Daher kann meine Erklärung intern nicht zutreffen. Nichtsdestotrotz werden alle obigen Beispiele als gegeben bewertet, wodurch meine Theorie bestätigt (aber nicht bewiesen) wird.
Ich habe dies unter Windows 7, 64-Bit mit nur * .exe-Aufrufen mit Parameterübergabe getestet (nicht * .bat, aber ich würde annehmen, dass es genauso funktioniert).
quelle
Versuche dies:
"" Escape to a Single "im Parameter.
quelle
myscript """test test"""
und es funktioniert nicht (der erste Parameter wird als übergeben"test
. Eigentlich benötigen Sie drei Anführungszeichen:myscript """"test test""
Das dritte Anführungszeichen am Ende kann jedoch übersprungen werden.char **argv
mit Funktionen wiespawn
oder von meinem C-Launcher zu einem anderen Prozess wechseln mussteexec
. Danke dir. :-)Das zweite Dokument, das Peter Mortensen in seinem Kommentar zur Antwort von Codesmith zitierte, machte die Dinge für mich viel klarer. Dieses Dokument wurde von windowsinspired.com geschrieben. Der Link wiederholte sich: Ein besserer Weg, um das Zitieren und Escaping von Windows-Befehlszeilenargumenten zu verstehen .
Einige weitere Versuche und Irrtümer führen zu der folgenden Richtlinie:
Entkomme jedem doppelten Zitat
"
mit einem Caret^
. Wenn Sie andere Zeichen mit besonderer Bedeutung für die Windows - Befehlsshell wollen (zB<
,>
,|
,&
) als reguläre Zeichen stattdessen interpretiert wird, dann sie mit einem caret zu entkommen, auch.Wenn Sie möchten, dass Ihr Programm foo den Befehlszeilentext empfängt
"a\"b c" > d
und seine Ausgabe in die Datei out.txt umleitet , starten Sie Ihr Programm wie folgt über die Windows-Befehlsshell:Wenn foo
\"
als wörtliches doppeltes Anführungszeichen interpretiert und erwartet, dass nicht umschlossene doppelte Anführungszeichen Argumente begrenzen, die Leerzeichen enthalten, interpretiert foo den Befehl so, dass ein Argumenta"b c
, ein Argument>
und ein Argument angegeben werdend
.Wenn foo stattdessen ein doppeltes Anführungszeichen
""
als wörtliches doppeltes Anführungszeichen interpretiert , starten Sie Ihr Programm alsDie wichtigste Erkenntnis aus dem zitierten Dokument ist, dass für die Windows-Befehlsshell ein nicht entkoppeltes doppeltes Anführungszeichen den Wechsel zwischen zwei möglichen Zuständen auslöst.
Einige weitere Versuche und Irrtümer implizieren, dass im Ausgangszustand die Umleitung (zu einer Datei oder Pipe) erkannt wird und ein Caret
^
einem doppelten Anführungszeichen entgeht und das Caret aus der Eingabe entfernt wird. Im anderen Zustand wird die Umleitung nicht erkannt und ein Caret entgeht keinem doppelten Anführungszeichen und wird nicht entfernt. Nennen wir diese Zustände "außen" bzw. "innen".Wenn Sie die Ausgabe Ihres Befehls umleiten möchten, muss sich die Befehlsshell im Außenzustand befinden, wenn sie die Umleitung erreicht. Daher muss vor der Umleitung eine gerade Anzahl von doppelten Anführungszeichen (durch Caret) stehen.
foo "a\"b " > out.txt
funktioniert nicht - die Befehlsshell übergibt das gesamte als kombinierte Befehlszeilenargumente"a\"b " > out.txt
an foo , anstatt nur zu übergeben"a\"b "
und die Ausgabe an out.txt umzuleiten .foo "a\^"b " > out.txt
funktioniert auch nicht, da das Caret^
im inneren Zustand angetroffen wird, in dem es sich um ein gewöhnliches Zeichen und nicht um ein Fluchtzeichen handelt, und daher"a\^"b " > out.txt
an foo übergeben wird .Die einzige Möglichkeit, die (hoffentlich) immer funktioniert, besteht darin, die Befehlsshell immer im externen Zustand zu halten, da dann die Umleitung funktioniert.
Wenn Sie keine Umleitung benötigen (oder andere Zeichen mit besonderer Bedeutung für die Befehlsshell), können Sie auf die Carets verzichten. Wenn foo
\"
als wörtliches doppeltes Anführungszeichen interpretiert wird , können Sie es als bezeichnenDann empfängt foo
"a\"b c"
als kombiniertes Argument Text und kann ihn als einzelnes Argument gleich interpretierena"b c
.Nun - endlich - zur ursprünglichen Frage. Wird
myscript '"test"'
von der Windows-Befehlsshell aufgerufen und'"test"'
an MyScript übergeben . Anscheinend interpretiert Myscript die einfachen und doppelten Anführungszeichen als Argumenttrennzeichen und entfernt sie. Sie müssen herausfinden, was Myscript als wörtliches Anführungszeichen akzeptiert, und dies dann in Ihrem Befehl angeben,^
um alle Zeichen zu umgehen , die für die Windows-Befehlsshell eine besondere Bedeutung haben. Da diesmyscript
auch unter Unix verfügbar ist, reicht es vielleicht aus\"
. Versuchenoder, wenn Sie keine Umleitung benötigen,
quelle
Ich rufe Powershell von cmd aus an, und das Übergeben von Zitaten und keine Flucht hier hat funktioniert. Der schwerwiegende Akzent verhinderte doppelte Anführungszeichen bei diesem Win 10 Surface Pro.
Unten sind die Ausgaben aufgeführt, die ich für andere Zeichen erhalten habe, um einem doppelten Anführungszeichen zu entgehen:
Die Verwendung eines anderen Zitats, um einem Zitat zu entkommen, führte zu keinen Zitaten. Wie Sie sehen können, wurden die Zeichen selbst getippt, konnten sich aber den doppelten Anführungszeichen nicht entziehen.
quelle