Frage

Wie würde ich mich über all die doppelten Anführungszeichen in meiner Batch-Datei der Parametern mit entkam doppelten Anführungszeichen zu ersetzen? Dies ist meine aktuelle Batch-Datei, die alle seine Kommandozeilen-Parameter innerhalb der Zeichenfolge erweitert:

@echo off
call bash --verbose -c "g++-linux-4.1 %*"

Es nutzt dann diese Zeichenfolge einen Aufruf an Cygwin bash zu machen, einen Linux-Cross-Compiler ausführt. Leider bin ich Parameter wie diese immer an meine Batch-Datei übergeben:

"launch-linux-g++.bat" -ftemplate-depth-128 -O3 -finline-functions 
-Wno-inline -Wall  -DNDEBUG   -c 
-o "C:\Users\Me\Documents\Testing\SparseLib\bin\Win32\LinuxRelease\hello.o" 
"c:\Users\Me\Documents\Testing\SparseLib\SparseLib\hello.cpp"

Wenn das erste Zitat um den ersten übergeben Weg in vorzeitig endet die Zeichenfolge GCC geleitet wird, und Leiten der Rest der Parameter direkt zu bash (die spektakulär ausfällt.)

Ich stelle mir vor, wenn ich die Parameter in einem einzigen String verketten kann dann die Anführungszeichen entkommen es sollte funktionieren, aber ich habe Schwierigkeiten, zu bestimmen, wie dies zu tun. Kennt jemand?

War es hilfreich?

Lösung 3

Google kam schließlich mit der Antwort auf. Die Syntax für die Zeichenfolge Ersatz im Batch ist dies:

set v_myvar=replace me
set v_myvar=%v_myvar:ace=icate%

Welche produziert "replizieren me". Mein Skript sieht nun wie folgt aus:

@echo off
set v_params=%*
set v_params=%v_params:"=\"%
call bash -c "g++-linux-4.1 %v_params%"

Welche alle Instanzen " mit \" ersetzt, entkam richtig für bash.

Andere Tipps

Die Escape-Zeichen in Batch-Skripten sind ^. Aber für Strings in doppelten Anführungszeichen, verdoppelt die Anführungszeichen:

"string with an embedded "" character"

eplawless eigene Antwort einfach und effektiv löst sein spezifisches Problem: es alle mit " \" Instanzen im gesamten Argumentliste ersetzt , das ist, wie Bash doppelte Anführungszeichen innerhalb eines Strings in doppelten Anführungszeichen erfordert dargestellt werden.

im Allgemeinen auf die Frage von zu beantworten, wie doppelte Anführungszeichen innerhalb eines Strings in doppelten Anführungszeichen mit cmd.exe zu entkommen , die Windows-Befehlszeilen-Interpreter (ob auf der Kommandozeile - oft noch fälschlicherweise als " DOS-Eingabeaufforderung“- oder in einer Batch-Datei): Boden für einen Blick finden Sie in Powershell

.

tl; dr :

  • Sie muss Verwendung "" beim Passieren einer Zeichenfolge , um eine (weitere) Batch-Datei und Sie können Verwendung "" mit Anwendungen erstellt Microsoft 's C / C ++ /. NET-Compiler (die auch akzeptieren \"), die unter Windows enthält Python und Node.js :

    • Beispiel: foo.bat "We had 3"" of rain."

    • Das gilt für Batch-Dateien nur:

      • "" ist der einzige Weg, um die Kommando-Interpreter (cmd.exe) zu behandeln, um die ganzen Strings in doppelten Anführungszeichen als Single Argument.

      • bekommen
      • Leider ist jedoch nicht nur die umschließende beibehalten doppelten Anführungszeichen (wie üblich), aber so die verdoppelten entkam diejenigen sind, so die beabsichtigte Zeichenfolge zu erhalten, ist ein zweistufiger Prozess; beispielsweise unter der Annahme, dass der doppelten Anführungszeichen Zeichenfolge als erstes Argument übergeben wird, %1:

      • set "str=%~1" entfernt die umschließenden Anführungszeichen; set "str=%str:""="%" wandelt dann die verdoppelten doppelten Anführungszeichen zu einzelnen Einsen.
        Achten Sie darauf, die umschließenden Anführungszeichen um die Zuordnung Teile zu verwenden, um unerwünschte Interpretation der Werte zu verhindern.

  • \" ist erforderlich - als einzige Option - von vielen anderen Programmen , (! ZB, Ruby, Perl und sogar Microsofts eigenes Powershell ()) , aber ITS USE ist nicht sicher :

    • \" ist, was viele ausführbaren Dateien und Dolmetscher entweder erfordern - einschließlich Microsofts eigenes Powershell, wenn Strings übergeben von außen - oder, im Fall von Microsoft-Compiler, Unterstützung als Alternative zu "" -. letztlich aber es ist Programm zum Ziel, um die Argumentliste zu analysieren
      • Beispiel: foo.exe "We had 3\" of rain."
    • JEDOCH VERWENDUNG VON \" KANN IN UNWANTED, ARBITRARY Ausführung von Befehlen Ergebnis und / oder Ein- / Ausgabeumleitungen :
      • Die folgenden Zeichen präsentieren dieses Risiko: & | < >
      • Zum Beispiel kann die folgenden Ergebnisse in unbeabsichtigter Ausführung des Befehls ver; siehe weiter unten für eine Erklärung und der nächsten Aufzählungspunkt für dieses Problem zu umgehen:
        • foo.exe "3\" of snow" "& ver."
    • für Powershell auf Fenster , \"" und "^"" robust ist, aber begrenzte Alternativen (Abschnitt "Aufruf Powershell CLI ..." siehe unten ).
  • Wenn Sie \" verwenden müssen, gibt es nur 3 sicher Ansätze , die jedoch recht umständlich : Spitze des Hutes zu TS für seine Hilfe.

    • Verwendung von (möglicherweise selektiven ) verzögert variable Erweiterung in Batch-Datei, können Sie speichern wörtliche \" in einem Variable und Referenz, die Variable innerhalb eines "..." String !var! Syntax Arbeiten - siehe T Ss hilfreiche Antwort .

      • Der obige Ansatz trotz umständlich ist, hat den Vorteil, dass Sie es anwenden können methodisch und dass es funktioniert robust , mit jedem Eingang.
    • Nur mit Literalzeichenfolgen - diejenigen, mit denen keine VARIABLES - bekommt man einen ähnlich methodischen Ansatz: kategorisch ^-escape alle cmd.exe Metazeichen: " & | < > und - falls Sie wollen auch variable Expansion zu unterdrücken - %:
      foo.exe ^"3\^" of snow^" ^"^& ver.^"

    • Ansonsten müssen Sie formulieren Sie Ihre Zeichenfolge basierend auf dem Erkennen, welche Teile des Strings cmd.exe betrachtet nicht notierte aufgrund falsch interpretiert \" als Schlussbegrenzungszeichen:

      • in wörtlichen Teile enthalten Shell-Metazeichen: ^-entkommen sie; Im oben genannten Beispiel ist es & die ^-escaped werden müssen:
        foo.exe "3\" of snow" "^& ver."

      • in Portionen mit %...% Stil Variablenreferenzen : dass cmd.exe gewährleisten hält sie Teil einer "..." Zeichenfolge und , dass die Variablenwerte nicht selbst eingebettet haben , unausgewogene Zitate -. , die nicht einmal immer möglich ist

Hintergrundinformationen lesen Sie weiter.


Hintergrund

Hinweis: Dies ist auf Grund meiner eigenen Experimente. Lassen Sie uns wissen, wenn ich falsch bin.

POSIX-ähnliche Shells wie Bash auf Unix-ähnlichen Systemen tokenize der Argumentliste (string), bevor er Argumente einzeln in das Zielprogramm: unter anderem Erweiterungen, sie spaltete die Argumentliste in einzelne Wörter (Wort Splitting) und entfernen Sie zitieren Zeichen aus den resultierenden Worte (Zitat Entfernung). Das Zielprogramm ist ein array von einzelne Argumente , mit syntaktischen Zitate entfernt geben .

Im Gegensatz dazu Interpreter der Windows-Befehl offenbar nicht die Argumentliste nicht tokenize und einfach geht das Single string umfassend alle Argumente - einschließlich zitierte Zeichen. -. In das Zielprogramm
Allerdings einige Vorverarbeitung erfolgt, bevor die einzelne Zeichenfolge in das Zielprogramm übergeben wird: ^ Zeichen entkommen. außerhalb von Strings in doppelten Anführungszeichen werden entfernt (sie entziehen das folgende char.) und Variablenreferenzen (beispielsweise %USERNAME%) sind interpolieren zuerst.

Im Gegensatz zu in Unix, es ist die Verantwortung des Zielprogramms zu analysieren, um die Argumente Zeichenfolge zu analysieren und es brechen in einzelne Argumente mit Zitaten entfernt. So verschiedene Programme hypothetisch entweichende Methoden erfordern, können unterschiedliche und gibt es keinen einzigen entkommen Mechanismus, der garantiert ist mit allen Programmen zu arbeiten - < a href = "https://stackoverflow.com/a/4094897/45375"> https://stackoverflow.com/a/4094897/45375 enthält ausgezeichneten Hintergrund auf der Anarchie, die Windows-Befehlszeilen Parsing ist.

In der Praxis ist \" sehr häufig, aber NICHT SICHER , wie oben erwähnt:

Da cmd.exe selbst nicht erkennt \" als entkam doppelte Anführungszeichen, kann es später Token auf der Kommandozeile als falsch auslegen unquoted und möglicherweise interpretiert sie als Befehle und / oder Eingabe / Ausgabe-Umleitungen .
Auf den Punkt gebracht: die Problemflächen, wenn eine der folgenden Zeichen folgen eine Öffnen oder unausgewogen \": & | < > ; zum Beispiel:

foo.exe "3\" of snow" "& ver."

cmd.exe sieht folgenden Tokens, die aus falsch interpretiert\" als regelmäßige doppelte Anführungszeichen:

  • "3\"
  • of
  • snow" "
  • Rest: & ver.

Da cmd.exe denkt, dass & ver. sind unquoted , sie es als & interpretiert (der Befehl Sequenzierung Operator), durch den Namen eines Befehls gefolgt auszuführen (ver. - die . ignoriert; ver Berichte cmd.exe der Versionsinformationen).
Der Gesamteffekt ist:

  • Zuerst foo.exe wird aufgerufen mit dem ersten 3 Token nur.
  • Dann Befehl ver ausgeführt.

Auch in Fällen, in denen der versehentlichen Befehl keinen Schaden anrichtet, Ihr gesamte Befehl wird nicht wie vorgesehen, da nicht alle Argumente an sie übergeben werden.

Viele Compiler / Dolmetscher erkennen nur \" - zB die GNU C / C ++ Compiler, Python, Perl, Ruby, sogar eigene Powershell Microsoft, wenn sie von cmd.exe aufgerufen - und, mit Ausnahme von Powershell mit \"", für sie gibt es keine einfache Lösung für dieses Problem.
Im Wesentlichen würde, Sie im Voraus wissen müssen, welche Teile der Kommandozeile als nicht notiert falsch interpretiert, und selektiv alle Instanzen ^ in diesen Abschnitten & | < >-entweichen kann.

Im Gegensatz dazu Verwendung von "" ist SAFE , ist aber leider nur von Microsoft-Compiler-basierten Anwendungen und Batch-Dateien (im Fall von Batch-Dateien unterstützt, mit die oben diskutierten Macken), die bemerkenswerte schließt Powershell -. siehe nächster Abschnitt


Beim Powershell CLI von cmd.exe oder POSIX-ähnlichen Schalen:

Hinweis: Siehe den unteren Abschnitt, wie unter Angabe behandelt wird innen Powershell

.

Powershell , wenn aufgerufen von außen - zum Beispiel von cmd.exe, ob von der Kommandozeile oder einer Batch-Datei - erkennt nur \" und unter Windows auch """ und die robustere \"" / "^"" (obwohl intern Powershell ` als Escape-Zeichen in Strings in doppelten Anführungszeichen verwendet und akzeptiert auch "" - siehe unten Abschnitt):

Ein Fenster , ruft aus cmd.exe / a Batch-Datei:

  • "" Pausen , weil es im Grunde nicht unterstützt:

    • powershell -c " ""ab c"".length " -> Fehler "Der String fehlt den Terminator"
  • \" und """ Arbeit im Prinzip , ist aber nicht sicher :

    • powershell -c " \"ab c\".length " funktioniert wie beabsichtigt: es gibt 5 (beachten Sie die 2 Leerzeichen)
    • Aber es ist nicht sicher, da cmd.exe Metazeichen den Befehl brechen, es sei denn, entkam:
      powershell -c " \"a& c\".length " Pausen , aufgrund der &, die als ^& entkommen werden müssten
  • \"" ist sicher , sondern Innen Leerzeichen normalisieren , die unerwünscht sein kann:

    • powershell -c " \""a& c\"".length " Ausgänge 4 (!), Weil die zwei Räume auf 1 normiert sind.
  • "^"" ist die beste Wahl für Windows Powershell speziell , wobei es sowohl sicher als auch Leerzeichen erhaltend ist, aber mit Powershell Kern (unter Windows) ist es das gleiche wie \"" ist , das heißt whitespace- Normalisieren . Kredit geht an Venryx für diesen Ansatz zu entdecken.

    • powershell -c " "^""a& c"^"".length " funktioniert . nicht brechen - trotz & - und Ausgänge 5, das heißt korrekt aufbewahrt Leerzeichen

    • Powershell Kern : pwsh -c " "^""a& c"^"".length " funktioniert , aber Ausgänge 4, dh normalisieren Leerzeichen , wie \"" tut

      <. / li>

Ein Unix-ähnlichen Plattformen (Linux, MacOS), ruft Powershell Kern 's CLI, pwsh von einem POSIX-artige Shell wie als bash:

Sie muss Verwendung \" , die jedoch ist sicher und Leerzeichen erhalt :

$ pwsh -c " \"a&  c|\".length" # OK: 5

Verwandte Informationen

  • ^ kann nur als Escape-Zeichen verwendet werden in unquoted Strings - innerhalb von Strings in doppelten Anführungszeichen, ^ ist nicht besonders und so behandelt, als eine wörtliche <. / p>

    • CAVEAT : Verwendung von ^ in Parameter an die call Anweisung übergeben gebrochen (dies für beide Anwendungen von call gilt: Um eine andere Batch-Datei oder Binär-Aufruf, und ruft ein Unterprogramm in der gleichen Batch-Datei):
      • ^ Instanzen in in doppelten Anführungszeichen Werte aus unerklärlichen Gründen verdoppelt , um den Wert zu verändern weitergegeben werden: zB wenn der Variable %v% Literalwert a^b enthält , call :foo "%v%" ordnet "a^^b" (!) (der erste Parameter) in Unterprogramm %1 :foo.
      • Unquoted Verwendung von ^ mit call ist zusammen gebrochen in diesem ^ nicht mehr verwendet werden können Sonderzeichen zu entkommen: zB call foo.cmd a^&b leise Pausen (statt wörtlichen a&b zu foo.cmd zugeben, wie es der Fall ohne call sein) - (!). foo.cmd nicht einmal aufgerufen wird, zumindest auf Windows 7
  • ein wörtliche % Flüchten ist ein Sonderfall , leider, die je nach unterschiedlicher Syntax erfordern, ob eine Zeichenfolge auf der Befehlszeile angegeben wird vs in einer Batch-Datei . finden Sie unter https://stackoverflow.com/a/31420292/45375

    • Die Kurz davon: Innerhalb einer Batch-Datei, verwenden %%. Auf der Kommandozeile, % nicht entziehen kann, aber wenn man einen ^ am Anfang, Ende setzen, oder in einem Variablennamen in einem unquoted string (zB echo %^foo%), können Sie variable Expansion verhindern können ( Interpolation); % Instanzen auf der Befehlszeile, die nicht Teil einer variablen Referenz ist, werden als Literale behandelt (z.B. 100%).
  • Im Allgemeinen , um sicher mit variablen Werten zu arbeiten, die Leer- und Sonderzeichen enthalten:

    • Zuordnung : Enclose beide der Variablenname und der Wert in eine Single Paar doppelte Anführungszeichen ; z.B. set "v=a & b" Literalwert a & b variable %v% zuordnet (im Gegensatz dazu würde die set v="a & b" doppelten Anführungszeichen Teil des Wertes machen). Entfliehen wörtliche % Instanzen als %%. (Nur in Batch-Dateien funktioniert - siehe oben)
    • Referenz : Double-quote Variablenreferenzen , um sicherzustellen, dass ihr Wert nicht interpoliert wird; zum Beispiel hat echo "%v%" nicht den Wert von %v% der Interpolation unterziehen und Druck "a & b" (aber beachten Sie, dass die doppelten Anführungszeichen sind zu immer gedruckt). Im Gegensatz dazu geht echo %v% wörtlichen a zu echo interpretiert & als Befehl Sequenzierung Operator und deshalb versucht, einen Befehl namens b auszuführen.
      Beachten Sie auch die obige Einschränkung re Verwendung von ^ mit der call Aussage.
    • Externe Programme nehmen in der Regel Pflege doppelte Anführungszeichen um Parameter umschließenden zu entfernen, aber, wie erwähnt, in Batch-Dateien Sie es selbst zu tun haben (zB %~1 aus dem umschließenden doppelten Anführungszeichen zu entfernen 1. Parameter) und leider gibt es keine direkte Möglichkeit, die ich kenne zu bekommen echo einen variablen Wert drucken getreu ohne die umschließenden Anführungszeichen .
      • Neil Angebote ein for-basierte Problemumgehung, die funktioniert, solange der Wert hat keine eingebetteten doppelte Anführungszeichen ; z.B .:
        set "var=^&')|;,%!" for /f "delims=" %%v in ("%var%") do echo %%~v
  • cmd.exe tut nicht erkennen Single -quotes als String-Trennzeichen - sie werden als Literale behandelt und nicht allgemein verwendet werden kann, abgrenzen Strings mit eingebetteten Leerzeichen; auch, folgt daraus, dass die Tokens die Apostrophe und keine Token zwischen behandelt werden anstößt wie entsprechend durch cmd.exe und interpretiert unquoted.

    • gegeben jedoch, dass die Zielprogramme letztlich ihr eigenes Argument Parsing durchführen, einige Programme wie Ruby tun erkennen Single-Strings in Anführungszeichen auch unter Windows; dagegen, C / C ++ ausführbare Dateien, Perl und Python tun nicht erkennen sie.
      Auch wenn durch das Zielprogramm unterstützt, ist es jedoch nicht ratsam ist, Single-Strings in Anführungszeichen zu verwenden, da ihre Inhalte nicht von potentiell unerwünschten Interpretation durch cmd.exe geschützt sind.

Zitiert von in Powershell:

Windows Powershell ist eine wesentlich erweiterte Shell als cmd.exe, und es ist ein Teil gewesen viele Jahre von Windows für jetzt (und Powershell-Core die Powershell-Erfahrung zu macOS und Linux als auch gebracht).

Powershell arbeitet konsequent intern in Bezug auf unter Angabe:

  • innerhalb Strings in doppelten Anführungszeichen, verwenden `" oder "" doppelte Anführungszeichen zu entkommen
  • innerhalb Single-Strings in Anführungszeichen verwenden '' Apostrophe
  • zu entkommen

Dies funktioniert auf der Kommandozeile Powershell und wenn Parameter Powershell-Skripts oder Funktionen von vorbei innerhalb Powershell.

(Wie oben erläutert, einen entflohenen doppelten Anführungszeichen zu Powershell vorbei von außen erfordert \" oder, robuster, \"" - nichts anderes Werk).

Leider beim Aufruf von externe Programme von Powershell, sind Sie mit der Notwendigkeit konfrontiert, sowohl Powershell eigene zitiert Regeln aufnehmen und für die target Programm:

Dieses problematische Verhalten wird auch in dieser GitHub docs Ausgabe

Double -quotes innerhalb von Doppel -quoted Strings :

Betrachten Zeichenfolge "3`" of rain", die Powershell-intern zu wörtlichem 3" of rain übersetzt.

Wenn Sie diese Zeichenfolge an ein externes Programm übergeben wollen, Sie haben das Zielprogramm der Flucht zusätzlich zu Powershell anzuwenden; sagen Sie die Zeichenfolge in einem C-Programm übergeben werden sollen, die als \" entkommen werden doppelte Anführungszeichen eingebettet erwartet:

foo.exe "3\`" of rain"

Beachten Sie, wie beide `" - Pow zu machenerShell glücklich - und die \ - glücklich das Zielprogramm zu machen - müssen vorhanden sein.

Die gleiche Logik gilt eine Batch-Datei aufgerufen wird, wo "" verwendet werden muss:

foo.bat "3`"`" of rain"

Im Gegensatz dazu Einbettung Single -quotes in Doppel -quoted Zeichenfolge erfordert überhaupt kein Entkommen.

Single -quotes innerhalb von Single -quoted Strings tun nicht erfordert Extra Flucht; betrachten '2'' of snow', die Darstellung ist‘Powershell von 2' of snow.

foo.exe '2'' of snow'
foo.bat '2'' of snow'

Powershell übersetzt einfache Anführungszeichen Strings in doppelten Anführungszeichen diejenigen, bevor sie an das Zielprogramm übergeben.

Doch double -quotes innerhalb von Single -quoted Strings , die für Powershell brauchen nicht entkommen, Sie müssen noch für das Zielprogramm maskiert werden :

foo.exe '3\" of rain'
foo.bat '3"" of rain'

Powershell v3 die Magie eingeführt --% Option , die so genannte Stop-Parsing-Symbol , die einige der Schmerzen lindert, durch alles vorbei nach es uninterpretierte in das Zielprogramm zum speichern cmd.exe Stil umweltVariablenReferenzen (zB %USERNAME%), die ist erweitert; z.

foo.exe --% "3\" of rain" -u %USERNAME%

Beachten Sie, wie nur für das Zielprogramm des eingebettete " als \" entkommen (und nicht auch für Powershell als \`") ausreichend.

Doch dieser Ansatz:

  • darf nicht für Flucht % Zeichen, um umwelt variable Erweiterungen zu vermeiden.
  • schließt aus direkt Verwendung von Powershell-Variablen und Ausdrücke; Stattdessen muss die Befehlszeile in einem String-Variable in einem ersten Schritt aufgebaut werden, und dann mit Invoke-Expression in einem zweiten aufgerufen.

Somit ist trotz seiner vielen Fortschritte, hat Powershell nicht viel einfacher zu entkommen, wenn externe Programme aufrufen. Es hat sich jedoch wurde die Unterstützung für Single-Strings in Anführungszeichen.

Ich frage mich, ob es in der Windows-Welt grundsätzlich möglich ist, immer auf das Unix-Modell wechseln zu lassen, die Shell alles tun, die tokenization und Zitat Entfernung vorhersagbar vorne unabhängig von dem Zielprogramm , und dann, indem die resultierenden Token des Zielprogrammes aufrufen.

Als Ergänzung zu mklement0 der ausgezeichneten Antwort :

Fast alle ausführbaren Dateien akzeptieren \" als entkam ". Sichere Nutzung in cmd ist jedoch fast nur möglich mit DELAYEDEXPANSION.
Um explizit eine wörtliche " zu einem gewissen Prozess zu senden, weisen \" zu einer Umgebungsvariable, und dann diese Variable verwenden, wenn Sie ein Angebot übergeben müssen. Beispiel:

SETLOCAL ENABLEDELAYEDEXPANSION
set q=\"
child "malicious argument!q!&whoami"

Hinweis SETLOCAL ENABLEDELAYEDEXPANSION scheint nur in Batch-Dateien zu arbeiten. Um DELAYEDEXPANSION in einer interaktiven Sitzung zu erhalten, startet cmd /V:ON.

Wenn Sie Ihre Batch-Datei Arbeit mit DELAYEDEXPANSION does't, können Sie es ermöglichen, vorübergehend:

::region without DELAYEDEXPANSION

SETLOCAL ENABLEDELAYEDEXPANSION
::region with DELAYEDEXPANSION
set q=\"
echoarg.exe "ab !q! & echo danger"
ENDLOCAL

::region without DELAYEDEXPANSION

Wenn Sie von einem variablen dynamischen Inhalt zu übergeben, die Anführungszeichen enthält, die entkommen sind als "" Sie "" mit \" auf Expansion ersetzen:

SETLOCAL ENABLEDELAYEDEXPANSION
foo.exe "danger & bar=region with !dynamic_content:""=\"! & danger"
ENDLOCAL

Diese Reserve ist nicht sicher mit %...% Stil Expansion!

Bei OP bash -c "g++-linux-4.1 !v_params:"=\"!" die sichere Version.


Wenn aus irgendeinem Grunde auch nur vorübergehend ermöglicht DELAYEDEXPANSION keine Option ist, lesen Sie auf:

Mit \" aus cmd ist ein wenig sicherer, wenn man immer Sonderzeichen entkommen muss, statt nur manchmal. (Es ist weniger wahrscheinlich, dass eine caret zu vergessen, wenn es konsequent ist ...)

Um dies zu erreichen, ein jedes Zitat mit einem caret voran (^"), Zitate, die das Kind Prozess als Literale erreichen sollen, müssen zusätzlich mit einem Spiel (\^") entwertet werden. Alle Shell-Metazeichen muss auch mit ^ entkommen, z.B. & => ^&; | => ^|; > => ^>; etc.

Beispiel:

child ^"malicious argument\^"^&whoami^"

Quelle: Jeder zitiert Befehlszeilenargumente in die falsche Richtung finden Sie unter‚Eine bessere Methode des Zitierens‘


dynamischen Inhalt zu übergeben, muss man folgendes gewährleisten:
Der Teil des Befehls, der die Variable enthält, muss von cmd.exe als „zitiert“ werden (dies nicht möglich ist, wenn die Variable Anführungszeichen enthalten kann - nicht schreiben %var:""=\"% ). Um dies zu erreichen, der letzte " vor den Variablen und der erste " nach den Variablen nicht ^-entkam. cmd-Metazeichen zwischen diesen beiden " darf nicht entgangen sein. Beispiel:

foo.exe ^"danger ^& bar=\"region with %dynamic_content% & danger\"^"

Dies ist nicht sicher, wenn %dynamic_content% unerreichte Anführungszeichen enthalten.

Zum Beispiel für Unreal Engine Automation Tool von Batchdatei ausführen - das ist für mich gearbeitet

zB:  -cmdline = "-Messaging" -Gerät = device -addcmdline = "- SessionId = Sitzung -SessionOwner = 'Besitzer' -SessionName = 'Build' -dataProviderMode = local -execcmds Automatisierung Liste '= 'LogCommodity OFF' -LogCmds =; runtests Tests + + by + T1 + T2 getrennt sind; beenden‘" -run

Hoffe, dass dies jemand hilft, arbeitete für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top