Nutzung von Anführungszeichen in Argumenten

Der Text einer Befehlszeile muss in einzelne Argumente unterteilt werden. Im folgenden Beispiel siehst du einen einfachen Programmaufruf mit einigen Argumenten.

Process.exe -arg1=xxx -arg2=yyy  c:\test\a_file.exe
           ^         ^         ^^

Diese Zeile wird in den Programmpfad und drei Argumente aufgeteilt, da diese durch Leerzeichen voneinander getrennt sind. Die Trennpunkte habe ich im Beispiel mit ^ markiert. Es ist irrelevant, ob es sich um ein Tabulatorzeichen oder ein Leerzeichen handelt, oder wie viele davon vorhanden sind.

Das ergibt folgende Liste von Argumenten, die an das Betriebssystem weitergegeben werden:

Process.exe         ← Programmpfad
-arg1=xxx           ← Argument 1
-arg2=yyy           ← Argument 2
c:\test\a_file.exe  ← Argument 3

Kommandozeilen-Shells verwenden normalerweise eine komplexe Logik um eine Befehlszeile in Argumente aufzuteilen. Sie erkennen dabei Pfade und Argumentmuster um diese Aufteilung so gut wie möglich vorzunehmen.

Da das Actions-System jedoch unabhängig von einer Kommandozeilen-Shell ist, wird diese Unterteilung durch die Software selbst vorgenommen. Der Actions-Server benutzt dafür einen sehr simplen Algorithmus. Dieser teilt alle Argumente anhand von Leerzeichen, es sei denn, sie sind in doppelten Anführungszeichen eingeschlossen. Die doppelten Anführungszeichen werden dann aus dem endgültigen Argument entfernt:

Process.exe -arg1="a b c" "c:\Program Files\a_file.exe"
           ^        ^ ^  ^           ^

Im obigen Beispiel sind alle Stellen, an denen die Aufteilung vorgenommen wird, wieder mit ^ markiert. In diesem Fall jedoch verhindern die doppelten Anführungszeichen die Aufteilung an diesen Stellen. Daher ergibt sich folgende Liste von Argumenten:

Process.exe                   ← Programmpfad
-arg1=a b c                   ← Argument 1
c:\Program Files\a_file.exe   ← Argument 2

Wie du siehst, wird das erste Argument nicht an der Stelle des doppelten Anführungszeichens aufgeteilt, wie es bei einigen Kommandozeilen-Shells der Fall wäre. In unserer Software fungieren die doppelten Anführungszeichen lediglich als Umschalter zwischen den Modi „Leerzeichen ignorieren“ und „Leerzeichen berücksichtigen“.

Ein Nachteil dieses einfachen Algorithmus ist, dass er es nicht zulässt, doppelte Anführungszeichen als Teil von Argumenten zu übergeben. Auch gibt es keine Escape-Sequenz, um doppelte Anführungszeichen an ein Programm zu übergeben. Mit Ausnahme der doppelten Anführungszeichen werden alle anderen Zeichen unverändert an das Programm übergeben.