Di Windows, berapa panjang maksimum string baris perintah? Artinya jika saya menentukan program yang membutuhkan argumen pada baris perintah sepertiabc.exe -name=abc
Aplikasi konsol sederhana yang saya tulis mengambil parameter melalui baris perintah dan saya ingin tahu berapa jumlah maksimum yang diizinkan.
Jawaban:
Dari dokumentasi Microsoft: Batasan string baris perintah Command prompt (Cmd. Exe)
sumber
Maaf telah menggali utas lama, tetapi saya pikir jawaban sunetos tidak benar (atau bukan jawaban lengkap). Saya telah melakukan beberapa percobaan (menggunakan ProcessStartInfo di c #) dan tampaknya string 'argumen' untuk perintah baris perintah dibatasi hingga 2048 karakter di XP dan 32768 karakter di Win7. Saya tidak yakin apa yang dimaksud dengan batas 8191, tetapi saya belum menemukan buktinya.
sumber
Sebagai @Sugrue, saya juga menggali utas lama.
Untuk menjelaskan mengapa ada batasan karakter 32.768 (menurut saya seharusnya 32767, tetapi mari percaya hasil pengujian eksperimental), kita perlu menggali ke dalam Windows API.
Tidak peduli bagaimana Anda meluncurkan program dengan argumen baris perintah, ia pergi ke ShellExecute , CreateProcess atau versi diperpanjang mereka. API ini pada dasarnya membungkus API tingkat NT lain yang tidak didokumentasikan secara resmi. Sejauh yang saya tahu panggilan ini membungkus NtCreateProcess , yang membutuhkan struktur OBJECT_ATTRIBUTES sebagai parameter, untuk membuat struktur yang digunakan InitializeObjectAttributes . Di tempat ini kita melihat
UNICODE_STRING
. Jadi sekarang mari kita lihat struktur ini:Ini menggunakan
USHORT
variabel (16-bit length [0; 65535]) untuk menyimpan panjang. Dan menurut ini , panjang menunjukkan ukuran dalam byte, bukan karakter. Jadi kami punya:65535 / 2 = 32767
(karenaWCHAR
panjangnya 2 byte).Ada beberapa langkah untuk menggali angka ini, tapi saya harap ini jelas.
Juga, untuk mendukung @sunetos menjawab apa yang diterima. 8191 adalah jumlah maksimum yang diperbolehkan untuk dimasuki
cmd.exe
, jika Anda melebihi batas ini,The input line is too long.
kesalahan dihasilkan. Jadi, jawaban benar meskipun faktanya itucmd.exe
bukan satu-satunya cara untuk menyampaikan argumen untuk proses baru.sumber
ObjectAttributes
hanya digunakan untuk deskriptor keamanan dan membuat pegangan yang dikembalikan dapat diwariskan. Baris perintah diteruskan diProcessParameters
, yang direferensikan oleh Blok Lingkungan Proses (PEB). Dengan yang lamaNtCreateProcess
, parameter ini harus ditulis ke proses anak melaluiNtWriteVirtualMemory
. Saat iniNtCreateUserProcess
digunakan, yang menggabungkan beberapa panggilan ke layanan kernel tunggal - misalnya menciptakanSection
,Process
danThread
benda-benda; dan menulis parameter proses.CreateProcessW
menggunakan string diakhiri null untuk baris perintah dan jalur aplikasi. Batasnya adalah 32.767 - 1, yaitu 32.766 karakter.CreateProcessW
, itu mungkin menyimpan panjang yang tepat dalamUNICODE_STRING
struktur, dan mengatur keduanyaLength
danMaximumLength
menjadi 65.534 , itu adalah argumen hukum untukNtCreateProcess
.Di Windows 10, masih ada 8.191 karakter ... setidaknya di komputer saya.
Itu hanya memotong teks apa pun setelah 8191 karakter. Sebenarnya, saya mendapat 8.196 karakter, dan setelah 8196, saya tidak bisa mengetik lagi.
Berikut skrip yang akan menguji berapa lama pernyataan yang dapat Anda gunakan. Nah, dengan asumsi Anda telah menginstal gawk / awk.
sumber