Jaka jest maksymalna długość ciągu wiersza poleceń w systemie Windows? Oznacza to, że jeśli określę program, który przyjmuje argumenty w wierszu poleceń, takie jakabc.exe -name=abc
Prosta aplikacja konsolowa, którą napisałem, pobiera parametry z wiersza poleceń i chcę wiedzieć, jaka jest maksymalna dopuszczalna kwota.
Odpowiedzi:
Z dokumentacji firmy Microsoft: Ograniczenie ciągu wiersza polecenia w wierszu polecenia (Cmd. Exe)
źródło
Przepraszam, że odkopałem stary wątek, ale myślę, że odpowiedź Sunetos nie jest poprawna (lub nie jest pełną odpowiedzią). Zrobiłem kilka eksperymentów (używając ProcessStartInfo w c #) i wydaje się, że ciąg „argumentów” dla polecenia wiersza poleceń jest ograniczony do 2048 znaków w XP i 32768 znaków w Win7. Nie jestem pewien, do czego odnosi się limit 8191, ale nie znalazłem jeszcze żadnych dowodów na to.
źródło
Jako @Sugrue również wykopuję stary wątek.
Aby wyjaśnić, dlaczego istnieje 32768 (myślę, że powinno być 32767, ale uwierzmy w wynik testów eksperymentalnych) ograniczenie znaków, musimy zagłębić się w Windows API.
Bez względu na to, jak uruchomisz program z argumentami wiersza poleceń, trafi on do ShellExecute , CreateProcess lub dowolnej rozszerzonej ich wersji. Te interfejsy API zasadniczo opakowują inne API poziomu NT, które nie są oficjalnie udokumentowane. O ile wiem, te wywołania zawijają NtCreateProcess , który wymaga struktury OBJECT_ATTRIBUTES jako parametru, do utworzenia tej struktury jest używany InitializeObjectAttributes . W tym miejscu widzimy
UNICODE_STRING
. Przyjrzyjmy się teraz tej strukturze:Używa
USHORT
zmiennej (długość 16-bitowa [0; 65535]) do przechowywania długości. I zgodnie z tym długość wskazuje rozmiar w bajtach, a nie w znakach. Mamy więc:65535 / 2 = 32767
(ponieważWCHAR
ma 2 bajty).Jest kilka kroków, aby zagłębić się w ten numer, ale mam nadzieję, że jest jasny.
Ponadto, aby wspierać @sunetos, odpowiedz, co jest akceptowane. 8191 to maksymalna dozwolona liczba
cmd.exe
, jeśli przekroczysz ten limit,The input line is too long.
zostanie wygenerowany błąd. Tak więc odpowiedź jest prawidłowa, mimo żecmd.exe
nie jest to jedyny sposób przekazywania argumentów za nowym procesem.źródło
ObjectAttributes
jest używany tylko jako deskryptor zabezpieczeń i sprawia, że zwracany uchwyt jest dziedziczony. Wiersz poleceń jest przekazywany wProcessParameters
, do którego odwołuje się blok środowiska procesu (PEB). W przypadku starej wersjiNtCreateProcess
parametry te muszą zostać zapisane w procesie potomnym za pośrednictwemNtWriteVirtualMemory
. ObecnieNtCreateUserProcess
jest używany, który łączy w sobie kilka połączeń do pojedynczej usługi jądra - np TworzenieSection
,Process
orazThread
obiektów; i zapisywanie parametrów procesu.CreateProcessW
używa łańcucha zakończonego znakiem null w wierszu poleceń i ścieżce aplikacji. Limit wynosi 32 767 - 1, czyli 32 766 znaków.CreateProcessW
może przechowywać dokładną długość wUNICODE_STRING
strukturze i ustawić zarównoLength
iMaximumLength
do 65,534 , jest to argument prawny zaNtCreateProcess
.W systemie Windows 10 wciąż jest 8191 znaków ... przynajmniej na moim komputerze.
Po prostu odcina dowolny tekst po 8191 znakach. Cóż, właściwie mam 8196 znaków, a po 8196 po prostu nie pozwoli mi już pisać.
Oto skrypt, który sprawdzi, jak długo możesz użyć instrukcji. Zakładając, że masz zainstalowany gawk / awk.
źródło