ใน Windows ความยาวสูงสุดของสตริงบรรทัดคำสั่งคืออะไร? หมายถึงถ้าฉันระบุโปรแกรมที่รับอาร์กิวเมนต์ในบรรทัดคำสั่งเช่นabc.exe -name=abc
แอปพลิเคชันคอนโซลอย่างง่ายที่ฉันเขียนรับพารามิเตอร์ผ่านทางบรรทัดคำสั่งและฉันต้องการทราบจำนวนเงินสูงสุดที่อนุญาต
ใน Windows ความยาวสูงสุดของสตริงบรรทัดคำสั่งคืออะไร? หมายถึงถ้าฉันระบุโปรแกรมที่รับอาร์กิวเมนต์ในบรรทัดคำสั่งเช่นabc.exe -name=abc
แอปพลิเคชันคอนโซลอย่างง่ายที่ฉันเขียนรับพารามิเตอร์ผ่านทางบรรทัดคำสั่งและฉันต้องการทราบจำนวนเงินสูงสุดที่อนุญาต
คำตอบ:
จากเอกสารของ Microsoft: ข้อ จำกัด สตริงบรรทัดคำสั่ง Command prompt (Cmd. exe)
ในคอมพิวเตอร์ที่ใช้ Microsoft Windows XP หรือใหม่กว่าความยาวสูงสุดของสตริงที่คุณสามารถใช้ได้ที่พรอมต์คำสั่งคือ 8191 อักขระ
ขออภัยที่ขุดเจอกระทู้เก่า แต่ฉันคิดว่าคำตอบของ sunetosไม่ถูกต้อง (หรือไม่ใช่คำตอบทั้งหมด) ฉันได้ทำการทดลองบางอย่างแล้ว (โดยใช้ ProcessStartInfo ใน c #) และดูเหมือนว่าสตริง 'อาร์กิวเมนต์' สำหรับคำสั่ง commandline จะ จำกัด ไว้ที่ 2048 อักขระใน XP และ 32768 อักขระใน Win7 ฉันไม่แน่ใจว่าขีด จำกัด 8191 หมายถึงอะไร แต่ฉันยังไม่พบหลักฐานใด ๆ
ในฐานะ @Sugrue ฉันกำลังขุดกระทู้เก่า ๆ
เพื่ออธิบายว่าเหตุใดจึงมี 32768 (ฉันคิดว่าควรเป็น 32767 แต่ให้เชื่อว่าผลการทดสอบทดลอง) ข้อ จำกัด ของอักขระที่เราต้องขุดลงใน Windows API
ไม่ว่าคุณจะเปิดโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่งอย่างไรมันจะไปที่ShellExecute , CreateProcessหรือเวอร์ชันเพิ่มเติมใด ๆ ก็ตาม โดยพื้นฐานแล้ว API เหล่านี้จะรวม API ระดับ NT อื่น ๆ ที่ไม่มีเอกสารเป็นทางการ เท่าที่ฉันรู้การเรียกเหล่านี้ห่อ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
จะไม่ใช่วิธีเดียวที่จะส่งผ่านข้อโต้แย้งสำหรับกระบวนการใหม่
ObjectAttributes
ใช้สำหรับตัวบอกความปลอดภัยเท่านั้นและทำให้หมายเลขอ้างอิงที่ส่งคืนสามารถสืบทอดได้ บรรทัดคำสั่งจะถูกส่งไปในProcessParameters
ซึ่งอ้างอิงโดย Process Environment Block (PEB) เมื่อใช้แบบเก่าNtCreateProcess
พารามิเตอร์เหล่านี้จะต้องถูกเขียนลงในกระบวนการย่อยผ่านทางNtWriteVirtualMemory
. ปัจจุบันNtCreateUserProcess
มีการใช้งานที่ผสมผสานหลายสายไปยังบริการเคอร์เนลเดียว - เช่นการสร้างSection
, Process
และThread
วัตถุ; และเขียนพารามิเตอร์กระบวนการ
CreateProcessW
ใช้สตริงที่สิ้นสุดด้วยค่า null สำหรับบรรทัดคำสั่งและเส้นทางของแอปพลิเคชัน ขีด จำกัด คือ 32,767 - 1 เช่น 32,766 อักขระ
CreateProcessW
มันอาจเก็บความยาวที่แน่นอนไว้ในUNICODE_STRING
โครงสร้างและตั้งค่าทั้งสองLength
และMaximumLength
เป็น 65,534 NtCreateProcess
มันเป็นข้อโต้แย้งทางกฎหมายสำหรับ
ใน 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