Wie lang ist eine Befehlszeilenzeichenfolge in Windows maximal? Das heißt, wenn ich ein Programm spezifiziere, das Argumente in der Befehlszeile akzeptiert, wie zabc.exe -name=abc
Eine einfache Konsolenanwendung, die ich geschrieben habe, nimmt Parameter über die Befehlszeile entgegen und möchte wissen, wie viel maximal zulässig ist.
Antworten:
Aus der Microsoft-Dokumentation: Einschränkung der Befehlszeilenzeichenfolge für die Eingabeaufforderung (Cmd. Exe)
quelle
Es tut mir leid , dass ich einen alten Thread ausgegraben habe , aber ich denke , die Antwort von sunetos ist nicht korrekt (oder nicht die vollständige Antwort). Ich habe einige Experimente durchgeführt (mit ProcessStartInfo in c #) und es scheint, dass die Zeichenfolge 'Argumente' für einen Befehlszeilenbefehl in XP auf 2048 Zeichen und in Win7 auf 32768 Zeichen beschränkt ist. Ich bin mir nicht sicher, worauf sich das 8191-Limit bezieht, aber ich habe noch keine Beweise dafür gefunden.
quelle
Als @Sugrue grabe ich auch einen alten Thread aus.
Um zu erklären, warum es 32768 (ich denke, es sollte 32767 sein, aber lassen Sie uns das experimentelle Testergebnis glauben) gibt, müssen wir die Windows-API einschränken.
Unabhängig davon , wie Sie ein Programm mit Befehlszeilenargumenten starten, wird es an ShellExecute , CreateProcess oder eine erweiterte Version gesendet . Diese APIs umfassen im Wesentlichen andere NT-APIs, die nicht offiziell dokumentiert sind. Soweit ich weiß, wird in diesen Aufrufen NtCreateProcess umbrochen , für das die Struktur OBJECT_ATTRIBUTES als Parameter erforderlich ist. InitializeObjectAttributes wird verwendet. An diesem Ort sehen wir
UNICODE_STRING
. Schauen wir uns nun diese Struktur an:Es verwendet
USHORT
(16-Bit - Länge [0; 65535]) Variablen zu speichern Länge. Und nach dieser zeigt Länge Größe in Bytes, nicht Zeichen. Wir haben also:65535 / 2 = 32767
(weilWCHAR
es 2 Bytes lang ist).Es gibt ein paar Schritte, um diese Zahl zu untersuchen, aber ich hoffe, es ist klar.
Um @sunetos zu unterstützen, antworten Sie auch, was akzeptiert wird. 8191 ist eine maximale Anzahl, die eingegeben werden
cmd.exe
darf. Wenn Sie diesen Grenzwert überschreiten, wird einThe input line is too long.
Fehler generiert. Die Antwort ist also richtig, obwohl diescmd.exe
nicht die einzige Möglichkeit ist, Argumente für einen neuen Prozess zu übergeben.quelle
ObjectAttributes
wird der nur für den Sicherheitsdeskriptor verwendet und macht das zurückgegebene Handle vererbbar. Die Befehlszeile wird in übergebenProcessParameters
, auf die der Process Environment Block (PEB) verweist. Beim altenNtCreateProcess
müssen diese Parameter über in den untergeordneten Prozess geschrieben werdenNtWriteVirtualMemory
. HeutzutageNtCreateUserProcess
verwendet, die mehrere Anrufe zu einem einzigen Kernel Service verbindet - zB ErstellenSection
,Process
undThread
Objekte; und Schreiben der Prozessparameter.CreateProcessW
verwendet WINAPI eine nullterminierte Zeichenfolge für die Befehlszeile und den Anwendungspfad. Das Limit beträgt 32.767 - 1, dh 32.766 Zeichen.CreateProcessW
, kann sie die genaue Länge in derUNICODE_STRING
Struktur speichern und beideLength
undMaximumLength
auf 65.534 setzen ist es ein rechtliches Argument fürNtCreateProcess
.In Windows 10 sind es immer noch 8191 Zeichen ... zumindest auf meinem Computer.
Nach 8191 Zeichen wird nur Text abgeschnitten. Eigentlich habe ich 8196 Zeichen und nach 8196 kann ich einfach nicht mehr tippen.
Hier ist ein Skript, mit dem getestet wird, wie lange eine Anweisung verwendet werden kann. Angenommen, Sie haben gawk / awk installiert.
quelle