Dieses Problem betrifft Perl v5.24.0 unter Windows 10
Außer für die einfachsten Fälle. Es ist immer ein Problem, Befehlszeilen und Parameterlisten zwischen Programmen zu übergeben. Unter Berücksichtigung der Auswirkungen von Leerzeichen und Shell-Metazeichen, möglicherweise so, dass die Daten über mehrere Ebenen von Aufrufen intakt bleiben, kann eine Unordnung von Escape- und Anführungszeichen
beinhalten Das Allheilmittel war schon immer die Mehrfachparameterform von system
(die auch versucht, die Shell nicht als Vermittler zu bezeichnen), so dass jeder Parameter zuverlässig getrennt wird, ohne auf Anführungszeichen zurückgreifen zu müssen
Ein Anruf wie dieser
%Vor%ist viel einfacher auf das Auge geschrieben so
%Vor%Ich kann jedoch keine Möglichkeit sehen, Werte zu übergeben, die einschließen umgebende Anführungszeichen
Wenn ich ein Testprogramm schreibe
und rufen Sie dann
auf %Vor%dann ist die Ausgabe, die ich bekomme, was ich erwarte
%Vor% Angenommen, ich möchte die Zeichenfolge "xxx"
übergeben. Wenn ich es versuche
Dann werden die Anführungszeichen irgendwann entfernt und die Ausgabe ist identisch mit dem vorhergehenden Beispiel
system
an, so dass die Ausgabe ["\"xxx\""]
? Ich habe alle möglichen Fluchtversuche versucht, aber die Lösung entzieht sich mir.
Das Problem:
%Vor%Ausgabe:
%Vor%Das ist so kaputt! [1]
Lösung:
%Vor%Ausgabe:
%Vor% Perl muss eine Befehlszeile erstellen, auch wenn die Shell nicht verwendet wird. Im Gegensatz zu Unix, bei dem der Systemaufruf zum Ausführen eines Programms den Pfad zu einem Programm übernimmt und eine Liste von Argumenten, der Windows Systemaufruf [2] Das ist der Grund, warum die Syntax system BLOCK LIST
nicht hilft.
Tatsächlich liegt es an der Anwendung, die Befehlszeile nach Argumenten zu analysieren! Zum Glück gibt es dafür einen Systemaufruf , so hat sich ein Standard gebildet.