簡體   English   中英

命令行字符串的最大長度

[英]Maximum Length of Command Line String

在 Windows 中,命令行字符串的最大長度是多少? 這意味着如果我在命令行上指定一個采用 arguments 的程序,例如abc.exe -name=abc

我編寫的一個簡單的控制台應用程序通過命令行獲取參數,我想知道允許的最大數量是多少。

來自 Microsoft 文檔: 命令提示符 (Cmd.exe) 命令行字符串限制

在運行 Microsoft Windows XP 或更高版本的計算機上,您可以在命令提示符下使用的字符串的最大長度為 8191 個字符。

很抱歉挖出一個舊線程,但我認為sunetos 的答案不正確(或者不是完整的答案)。 我做了一些實驗(在 c# 中使用 ProcessStartInfo),似乎命令行命令的“參數”字符串在 XP 中限制為 2048 個字符,在 Win7 中限制為 32768 個字符。 我不確定 8191 限制指的是什么,但我還沒有找到任何證據。

作為@Suglue,我也在挖掘一個舊線程。

要解釋為什么有 32768(我認為應該是 32767,但讓我們相信實驗測試結果)字符限制,我們需要深入研究 Windows API。

無論您如何使用命令行參數啟動程序,它都會轉到ShellExecuteCreateProcess或它們的任何擴展版本。 這些 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM