[windows] 명령 줄 문자열의 최대 길이

Windows에서 명령 줄 문자열의 최대 길이는 얼마입니까? 명령 줄에서 다음과 같은 인수를받는 프로그램을 지정하면abc.exe -name=abc

내가 작성한 간단한 콘솔 애플리케이션은 명령 줄을 통해 매개 변수를 가져 오며 최대 허용량을 알고 싶습니다.



답변

Microsoft 설명서에서 : 명령 프롬프트 (Cmd. exe) 명령 줄 문자열 제한

Microsoft Windows XP 이상을 실행하는 컴퓨터에서 명령 프롬프트에서 사용할 수있는 문자열의 최대 길이는 8191 자입니다.


답변

오래된 스레드를 파헤쳐 서 죄송하지만 sunetos의 답변 이 정확하지 않거나 전체 답변이 아닌 것 같습니다. 몇 가지 실험 (C #에서 ProcessStartInfo 사용)을 수행했으며 명령 줄 명령의 ‘인수’문자열이 XP에서는 2048 자, Win7에서는 32768 자로 제한되는 것 같습니다. 8191 제한이 무엇을 의미하는지 잘 모르겠지만 아직 증거를 찾지 못했습니다.


답변

@Sugrue로서 나는 또한 오래된 스레드를 파헤 치고 있습니다.

32768 (32767이어야한다고 생각하지만 실험적인 테스트 결과를 믿도록하겠습니다) 문자 제한이있는 이유를 설명하려면 Windows API를 파헤쳐 야합니다.

명령 줄 인수로 프로그램을 시작하는 방법에 관계없이 ShellExecute , CreateProcess 또는 확장 된 버전으로 이동합니다. 이러한 API는 기본적으로 공식적으로 문서화되지 않은 다른 NT 레벨 API를 래핑합니다. 내가 아는 한 이러한 호출은 포장 NtCreateProcess 필요 OBJECT_ATTRIBUTES의 그 구조를 만들려면 매개 변수로 구조를 InitializeObjectAttributes 사용됩니다. 여기에서 우리는 UNICODE_STRING. 이제이 구조를 살펴 보겠습니다.

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

USHORT길이를 저장하기 위해 (16 비트 길이 [0; 65535]) 변수를 사용합니다. 그리고 따라 길이 바이트가 아닌 문자의 크기를 나타냅니다. 그래서 우리는 : 65535 / 2 = 32767( WCHAR길이가 2 바이트 이기 때문에 ).

이 숫자를 파헤치는 몇 가지 단계가 있지만 명확하기를 바랍니다.


또한 @sunetos를 지원하려면 허용되는 내용에 응답하십시오. 8191은에 입력 할 수있는 최대 수이며이 cmd.exe제한을 초과하면 The input line is too long.오류가 생성됩니다. 따라서 cmd.exe새로운 프로세스에 대한 인수를 전달하는 유일한 방법은 아니지만 대답은 정확 합니다.


답변

Windows 10에서는 적어도 내 컴퓨터에서는 여전히 8191 자입니다.

8191 자 이후의 모든 텍스트를 잘라냅니다. 글쎄요, 실제로 8196 자 였는데 8196 자 이후에는 더 이상 입력 할 수 없습니다.

다음은 사용할 수있는 명령문의 길이를 테스트하는 스크립트입니다. 글쎄, gawk / awk가 설치되어 있다고 가정합니다.

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


답변