Maximale lengte van opdrachtregelreeks

Wat is in Windows de maximale lengte van een opdrachtregeltekenreeks? Dit betekent dat als ik een programma specificeer dat argumenten op de opdrachtregel aanneemt, zoals abc.exe -name=abc

Een eenvoudige consoletoepassing die ik heb geschreven, gebruikt parameters via de opdrachtregel en ik wil weten wat het maximaal toegestane aantal is.


Antwoord 1, autoriteit 100%

Uit de Microsoft-documentatie: Opdrachtprompt (Cmd.exe) beperking van de opdrachtregelreeks

Op computers met Microsoft Windows XP of hoger is de maximale lengte van de tekenreeks die u bij de opdrachtprompt kunt gebruiken 8191 tekens.


Antwoord 2, autoriteit 78%

Sorry voor het opgraven van een oude thread, maar ik denk dat het antwoord van sunetos’ antwoordniet correct is (of niet het volledige antwoord). Ik heb wat experimenten gedaan (met behulp van ProcessStartInfo in c#) en het lijkt erop dat de ‘argumenten’-tekenreeks voor een opdrachtregelopdracht beperkt is tot 2048 tekens in XP en 32768 tekens in Win7. Ik weet niet zeker waar de 8191-limiet naar verwijst, maar ik heb er nog geen bewijs van gevonden.


Antwoord 3, autoriteit 49%

Als @Sugrue ben ik ook een oud draadje aan het uitgraven.

Om uit te leggen waarom er 32768 (ik denk dat het 32767 zou moeten zijn, maar laten we de experimentele testresultaten geloven) karakterbeperkingen, moeten we in de Windows API duiken.

Het maakt niet uit hoe je een programma start met opdrachtregelargumenten, het gaat naar ShellExecute, CreateProcessof een uitgebreidere versie ervan. Deze API’s omsluiten in feite andere API’s op NT-niveau die niet officieel zijn gedocumenteerd. Voor zover ik weet omwikkelen deze aanroepen NtCreateProcess, wat vereist OBJECT_ATTRIBUTES-structuur als parameter, om te maken die structuur InitializeObjectAttributeswordt gebruikt. Op deze plaats zien we UNICODE_STRING. Laten we nu eens kijken naar deze structuur:

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} UNICODE_STRING;

Het gebruikt de variabele USHORT(16-bits lengte [0; 65535]) om de lengte op te slaan. En volgens dit, geeft de lengte de grootte aan in bytes, geen tekens. We hebben dus: 65535 / 2 = 32767(omdat WCHAR2 bytes lang is).

Er zijn een paar stappen om in dit nummer te graven, maar ik hoop dat het duidelijk is.


Ook, om @sunetos te ondersteunen, antwoord wat wordt geaccepteerd. 8191 is een maximum aantal dat mag worden ingevoerd in cmd.exe. Als u deze limiet overschrijdt, The input line is too long.wordt een fout gegenereerd. Het antwoord is dus correct, ondanks het feit dat cmd.exeniet de enige manier is om argumenten voor een nieuw proces door te geven.


Antwoord 4, autoriteit 6%

In Windows 10 zijn het nog steeds 8191 tekens…tenminste op mijn computer.

Het snijdt gewoon alle tekst af na 8191 tekens. Nou, eigenlijk heb ik 8196 tekens en na 8196 kan ik gewoon niet meer typen.

Hier is een script dat test hoe lang je een instructie kunt gebruiken. Nou, ervan uitgaande dat je gawk/awk hebt geïnstalleerd.

echo rem this is a test of how long of a line that a .cmd script can generate >testbat.bat
gawk 'BEGIN {printf "echo -----";for (i=10;i^<=100000;i +=10) printf "%%06d----",i;print;print "pause";}' >>testbat.bat
testbat.bat

Other episodes