Frage Verwenden von Backslash zum Maskieren von Zeichen in cmd.exe (Befehl runas als Beispiel)


Ich sehe, dass der Caret der dokumentierte Fluchtcharakter ist.

Aber ich habe ein Beispiel, das das für den doppelten Anführungszeichen zeigt, ^ funktioniert nicht und du musst verwenden \

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""

Warum ist das und wo ist es dokumentiert?


4
2017-08-30 09:40


Ursprung




Antworten:


Eines der Beispiele in RUNAS /? zeigt diese Syntax. Der Caret ist der Fluchtcharakter für CMD.EXE Aber in Windows können einzelne Programme ihre eigenen Escape-Zeichen und globbing implementieren.


4
2017-08-30 10:00



interessant .. und btw .. was macht cmd.exe mit den unescaped Zitaten am Ende? hält es sie, wenn ja, warum ... Oder entfernt sie sie ... wenn ja, warum wurden sie überhaupt gebraucht? - barlop
@ Barlop: Siehe Michaels Antworten. - Dennis Williamson
Bist du sicher \ "wird von runas interpretiert und nicht von cmd.exe? kompiliere diese w.c pastebin.com/28Q2Wxxr  zu w.exe Vergleichen a) w "a a" b) w "a a" c) w ^ "a a ^" Beachten Sie, was mit b insbesondere passiert. Ich denke, das ist die Cmd-Shell, die \ als Escape-Zeichen behandelt. - barlop
während es nicht cmd.exe war, das es interpretierte, ist es auch nicht das Programm, es ist die Laufzeit, die args teilt. Ich bin mir nicht sicher, ob man das Programm als frei bezeichnen würde, um es umzusetzen. mehr wie die Art und Weise, wie der Compiler es implementiert hat oder wie der Compiler es für die Programme implementiert. alle Programme geschrieben in ich nehme, ms visual c, würde argsv "soly" parsen msdn.microsoft.com/en-us/library/a1y7w461.aspx - barlop


In cmd, \ tut nicht Flucht ". Hier ist ein kurzer Beweis und eine Erklärung:

  1. Lauf echo "" & echo 1. (& ist ein spezieller char in cmd, left & right bedeutet laufen left dann renne right.) Wir können beides sehen echo "" und echo 1 werden erfolgreich ausgeführt.

  2. Als nächstes, lauf echo " & 1234. Wir können sehen, dass die Ausgabe ist " & 1234. Dies ist, weil die Öffnung " wurde nicht geschlossen und somit wird alles danach als String interpretiert, inklusive des speziellen Char &.

  3. Lauf echo "\" & 1234.

    • Ob \ entgeht Folgendes ", die Eröffnung " wird nicht geschlossen und die Zeichen & 1234 wird als Teil der Zeichenfolge interpretiert.

    • Ob \ entgeht dem folgenden nicht ", Das Folgendes " wird die Zeichenfolge schließen und & 1234 werden nicht als Teil der Zeichenfolge interpretiert werden.

    In der Ausgabe sehen wir nicht & 1234 interpretiert als Teil der Zeichenfolge. Das beweist das \ hat es nicht geschafft zu entkommen ".

Also was entgeht " in Anführungszeichen für das Argument übergeben? Während ^ wird außerhalb von Zitaten arbeiten (leicht über echo ^" & echo 1), nicht in Anführungszeichen.

In der Tat, wie können wir etwas so einfaches wie bekommen? echo """  &  echo 1 arbeiten?

Das ^ verkohlen? ...Nee, echo "^"" & echo 1 Ausgänge "^"", und nicht """.

Was ist mit " char selbst? ...Nee, echo """" & echo 1  Ausgänge """", und nicht """.

Der Fakt ist, Es gibt nichts, was entkommen wird " in Anführungszeichen für das übergebene Argument. Sie können für ein paar Jahre darüber grübeln und keine Lösung finden. Dies sind nur einige der inhärenten Einschränkungen von cmd-Skripten.

Die gute Nachricht ist jedoch, dass Sie höchstwahrscheinlich werden noch nie über eine Situation, in der Sie dies tun müssen. Sicher, es gibt keine Möglichkeit zu bekommen echo """  &  echo 1 um zu arbeiten, aber das ist nicht so eine große Sache, weil es einfach ein erfundenes Problem ist, dem Sie wahrscheinlich nie begegnen werden.

Betrachten Sie zum Beispiel runas. Es funktioniert gut, ohne zu entkommen " in Anführungszeichen weil runas wusste dass es keine Möglichkeit gibt, dies zu tun, und interne Anpassungen vorgenommen hat, um es zu umgehen. runas erfand seine eigenen Parserregeln (runas /flag "anything even including quotes") und interpretiert cmd Argumente nicht wie üblich. Offizielle Dokumentation für diese spezielle Syntax ist ziemlich spärlich (oder nicht vorhanden). Abgesehen von /? und helpEs ist meistens Versuch und Irrtum.


6
2017-08-26 01:33





Das \ Zeichen lässt den Interpreter das nächste Zeichen als a interpretieren Charakter statt einer Kennung.

Sie sehen es auch viel im Code:

"Hello \"World\""

das ist interpretiert wie

Hello "World"

in Ihrem Beispiel, um die Argumente zu übergeben cmdEs muss in "" eingeschlossen sein. Aber seit den Argumenten zu cmd enthält "(und dies würde das Gehäuse beenden), an die sie angehängt sind \. Wäre das "" nicht dort gewesen, hätte die /k dir \"%userprofile%\" wäre als Argumente interpretiert worden runasnicht zu cmd.

Der Grund, warum sie das% userprofile% einschließen, ist, weil dies eine Umgebungsvariable ist und durch Text ersetzt wird, der Leerzeichen enthalten könnte, die (aus dem gleichen Grund wie oben) das Argument darstellen würden cmd falsch.


3
2017-08-30 13:48



Sieht für mich so aus, als ob RunAs "Anführungszeichen" benötigt, wenn dieser zweite Parameter, der Programmparameter, ein Leerzeichen hat. Sonst denkt es, dass es mehr Parameter bekommt als es ist. Theoretisch könnte Runas geschrieben worden sein (ich meine codiert), um es zu Ende zu bringen, da ein Parameter keine Anführungszeichen benötigt. Im Gegensatz dazu. cmd.exe z.B. cmd / c dir a b Das nimmt -dir a b- als einen Parameter. - barlop
Auch ein komplexerer Punkt, es sieht so aus, als hätte Runas ohne "Aber kann nicht, weil es das" als Anfang und das nächste "als Ende nimmt. Wenn es nur die äußeren am Anfang genommen hat und enden, dann würde es keine mittleren brauchen, um z sogar eine böse aussehende Zeile wie diese C: \> runas / Benutzer: Administrator "runas / user: Administrator \" cmd / k Verzeichnis \ "% userprofile% \" \ "" Wenn es alle "und keine \" dann theoretisch Sie kann es noch verarbeiten. Aber nicht so wegen der Art, wie Runas geschrieben wurde. - barlop
@ Barlop: Denk nicht daran cmd als das Argument zu runas, weil es nicht ist. Das Argument für Runas ist cmd /k dir \"%userprofile%\". Ich habe jetzt nicht die Zeit, aber geben Sie mir ein paar Stunden und ich sollte in der Lage sein, Ihnen ein einfaches C ++ Programm zu erklären und wie diese Programme Argumente interpretieren. Ich denke, es wäre klarer. Damit, Antwort verpflichtet, sich zu ändern - Default
Eigentlich kann ich das verstehen und war einfach nicht klar. Ich kenne die Hauptmethode und argsv. Ich habe gehört, dass sie alle Argumente in ihrem ersten Element nehmen? ist das richtig? In Bezug auf mich, die cmd.exe erwähnen, gibt es eine Zweideutigkeit, ob ich cmd.exe in dieser Zeile bedeute, oder die outter cmd.exe, in der die Zeile geschrieben wird. Das einzige Mal, dass ich cmd.exe in dem erwähnte, was ich in diesen Kommentaren geschrieben habe, war cmd / c dir ab und ich habe Recht, dass -dir a b- ist 1 Parameter. Aber mir wurde gesagt (ich weiß nicht, ob es richtig ist), dass alle Windows-Programme alle ihre Argumente als 1 String bekommen, vermutlich argsv [0], und dann teilen sie sich selbst - barlop
@Michael, wenn du es willst in Warum form .. ich könnte fragen. Warum wird cmd / c dir so interpretiert wie cmd / c "dir a b" Während bei runas der Programmparameter (siehe runas /?) In Anführungszeichen gesetzt werden soll. Ich denke, Runas hätten leicht codiert werden können, um sie nicht zu wollen. Da sieht für mich das theoretisch aus, sollte sie nicht brauchen. - barlop