কমান্ড লাইন স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য


109

উইন্ডোজে, কমান্ড লাইনের স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য কত? অর্থ যদি আমি কোনও প্রোগ্রাম নির্দিষ্ট করি যা কমান্ড লাইনে যেমন আর্গুমেন্ট গ্রহণ করেabc.exe -name=abc

আমি লিখেছি এমন একটি সাধারণ কনসোল অ্যাপ্লিকেশন কমান্ড লাইনের মাধ্যমে প্যারামিটার নেয় এবং আমি জানতে পারি সর্বোচ্চ অনুমোদিত পরিমাণটি কী।


যদি কেউ আগ্রহী হন, আমি প্রোগ্রামগুলির জন্য দীর্ঘ কমান্ড লাইনগুলি সমর্থন করার জন্য একটি পথে কাজ করছি । ধরে নিই আমরা এর জন্য পর্যাপ্ত সমর্থন তৈরি করতে পারি, এটি মাইক্রোসফ্টকে কোনও কিছু ঠিক করার প্রয়োজন ছাড়াই এবং সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ এমন উপায়ে সম্পূর্ণ নিষেধাজ্ঞাগুলি সরিয়ে ফেলবে। সত্যই প্রশ্নের উত্তর নয়, তবে এখানে আইএমওর একটি লিঙ্ক থাকা ভাল।
অ্যাস্টায়ার

উত্তর:


86

মাইক্রোসফ্ট ডকুমেন্টেশন থেকে: কমান্ড প্রম্পট (Cmd। উদাহরণ) কমান্ড-লাইন স্ট্রিং সীমাবদ্ধতা

মাইক্রোসফ্ট উইন্ডোজ এক্সপি বা তারপরে চলমান কম্পিউটারগুলিতে, কমান্ড প্রম্পটে আপনি যে স্ট্রিংটি ব্যবহার করতে পারেন তার সর্বাধিক দৈর্ঘ্য 8191 টি অক্ষর।


33
এটি কেবলমাত্র কমান্ড প্রম্পট (প্রশ্ন অনুসারে) মাধ্যমে চালিত প্রোগ্রামগুলিতে প্রযোজ্য। শর্টকাটগুলি (.lnk) ২0০ টি অক্ষর, ক্রিয়েটপ্রসেস ৩২76767 এবং শেলএকসিকিউটে প্রায় ২০৪৪ অবধি সীমাবদ্ধ রয়েছে the বিষয়টির উপর রেমন্ড চেনের নিবন্ধ অনুসারে
এনটিএসকোবাল্ট

2 ^ 13-1 টি অক্ষর, এর দ্বারা বোঝা যায় যে কোনও কিছু 16 টি ট্র্যাক করা হয়েছে এবং এতে 13 টি বিট ব্যবহার করা হয়েছে। আমি ভাবছি অন্য 3 বিট কিসের জন্য?
স্কাইকি

@ulrichb এবং এখন সেই লিঙ্কটি আরও একটি ব্লগ মাইগ্রেশনের পরেও ভেঙে গেছে। উদ্ধৃত নিবন্ধটি এখন devblogs.microsoft.com/oldnewthing/20031210-00/?p=41553
অ্যাডাম

72

পুরাতন থ্রেডটি খননের জন্য দুঃখিত, তবে আমি মনে করি সনেটোসের উত্তর সঠিক নয় (বা পুরো উত্তর নয়)। আমি কিছু পরীক্ষা-নিরীক্ষা করেছি (সি # তে প্রসেসস্টার্টআইএনফো ব্যবহার করে) এবং মনে হচ্ছে একটি কমান্ডলাইন কমান্ডের জন্য 'আর্গুমেন্ট' স্ট্রিংটি এক্সপি-তে 2048 অক্ষর এবং উইন 7-তে 32768 অক্ষরের মধ্যে সীমাবদ্ধ। আমি নিশ্চিত না যে 8191 সীমাটি কী বোঝায়, তবে আমি এখনও এর কোনও প্রমাণ পাইনি।


আপনি উইন 7 এর 32k চিত্রটি কোথায় পাবেন? আমি এর জন্য কোনও উত্স খুঁজে পাচ্ছি না। আপনি কি পরিবেশের ব্লকের আকারের কথা ভাবছেন ?
পপ

1
সম্ভবত। সি # প্রসেসস্টার্টআইএনফো ক্লাসের মাধ্যমে কোনও প্রসেসে দীর্ঘ এবং দীর্ঘতর যুক্তি দিয়ে আমি 32k চিত্রটি পেয়েছি। এটি 32 কে-এর পরে একটি ব্যতিক্রম ছোঁড়ে।
Sugrue

10
@ লর্ডটর্গামাস, 32k সীমা UNICODE_STRING কাঠামোর (উত্তর দৈর্ঘ্যের) কারণে। বিষয় সম্পর্কে রেমন্ড চেনের নিবন্ধ অনুসারে সিএমডি লাইনগুলিকে 8192 টি অক্ষরের মধ্যে সীমাবদ্ধ করেছে (আমি মনে করি ক্যারেজ ফিরতি চূড়ান্ত চরিত্র) এবং শেলএক্সেকিউটেক্স সীমা "ইন্টারনেইট_ম্যাক্স_উইউআর_উইল_ইএনজিথ (প্রায় 2048)"
এনটিএসকোবাল্ট

1
উইন্ডোজ 10 এর পাওয়ারশেলের অধীনে কী হবে?
নীলজার

1
8191 cmd কমান্ড এবং পছন্দগুলি জন্য মনে হয় খুব বাস্তব, এই মধ্যে মাত্র দৌড়ে যখন MSBuild মধ্যে Exec এর মাধ্যমে একটি খুব দীর্ঘ কমান্ড চালানোর
stijn

40

@ সাগ্রু হিসাবে আমি একটি পুরানো থ্রেডও খনন করছি।

32768 কেন আছে তা ব্যাখ্যা করার জন্য (আমি মনে করি এটি 32767 হওয়া উচিত, তবে পরীক্ষামূলক পরীক্ষার ফলাফলকে বিশ্বাস করতে দেয়) উইন্ডোজ এপিআইতে খনন করতে আমাদের অক্ষরের সীমাবদ্ধতা রয়েছে।

আপনি কমান্ড লাইন আর্গুমেন্টের সাথে প্রোগ্রামটি কীভাবে লঞ্চ করবেন তা শেলএক্সেকিউট , ক্রিয়েটপ্রসেস বা তাদের সংস্করণে বাড়ানো কোনও বিষয় নয়। এই এপিআইগুলি মূলত অন্যান্য এনটি স্তরের এপিআই মুড়ে দেয় যা সরকারীভাবে নথিভুক্ত নয়। আমি যতদূর জানি এই কল মোড়ানো 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 বাইট দীর্ঘ)।

এই সংখ্যাটি খননের জন্য কয়েকটি পদক্ষেপ রয়েছে তবে আমি আশা করি এটি পরিষ্কার হয়ে গেছে।


এছাড়াও, কীভাবে গ্রহণযোগ্য তা উত্তর দেওয়ার জন্য @ সুনোটোসের সমর্থন জানাতে। 8191 হ'ল সর্বাধিক সংখ্যাটিতে প্রবেশের অনুমতি দেওয়া হয়েছে cmd.exe, যদি আপনি এই সীমাটি অতিক্রম করেন তবে The input line is too long.ত্রুটি উত্পন্ন হয়। সুতরাং, cmd.exeনতুন প্রক্রিয়াটি করার পক্ষে যুক্তিগুলি পাস করার একমাত্র উপায় নয় তা সত্ত্বেও উত্তরটি সঠিক ।


দৈর্ঘ্য 32,766 অক্ষর পর্যন্ত হয় কারণ নাল-টার্মিনেটেড স্ট্রিং সঞ্চিত থাকে।
এরিক সান

1
প্রক্রিয়াগুলির নামটির স্থানে নাম দেওয়া হয় না, তাই ObjectAttributesকেবলমাত্র সুরক্ষা বর্ণনাকারী এবং প্রত্যাবর্তিত হ্যান্ডেলটি উত্তরাধিকারসূত্রে তৈরি করতে ব্যবহৃত হয়। কমান্ড লাইনটি পাস করা হয় ProcessParameters, যা প্রক্রিয়া পরিবেশ ব্লক (পিইবি) দ্বারা রেফারেন্স করা হয়। পুরানো সঙ্গে NtCreateProcess, এই পরামিতিগুলির মাধ্যমে শিশু প্রক্রিয়াতে লিখতে হবে NtWriteVirtualMemory। আজকাল NtCreateUserProcessব্যবহার করা হয়, যা একটি একক কার্নেল সেবার বিভিন্ন কল সম্মিলন - যেমন তৈরী Section, Processএবং Threadবস্তু; এবং প্রক্রিয়া পরামিতি লিখছেন।
এরিক সান

@ryksun UNICODE_STRING কাঠামো অগত্যা নাল টার্মিনেটর সঞ্চয় করে না।
জ্যাকি

@ 賈 可 জ্যাকি, সম্ভবত একটি গণিত স্ট্রিং অগত্যা নাল-টার্মিনেটেড স্ট্রিং ব্যবহার করে না। উদাহরণস্বরূপ, এনটিএপিআই রেজিস্ট্রি ফাংশনগুলির সাহায্যে আমরা সেগুলির মধ্যে নালগুলি সহ মূল নামগুলি তৈরি করতে এবং অ্যাক্সেস করতে পারি, তবে এগুলি WINAPI রেজিস্ট্রি ফাংশনগুলির সাথে অ্যাক্সেসযোগ্য হবে না, যা নাল-টার্মিনেটেড স্ট্রিংগুলি ব্যবহার করে। তেমনি, WINAPI CreateProcessWকমান্ড লাইন এবং অ্যাপ্লিকেশন পাথের জন্য একটি নাল-টার্মিনেটেড স্ট্রিং ব্যবহার করে। সীমা 32,767 - 1, অর্থাৎ 32,766 অক্ষর।
এরিক সান

@ এরিকসুন আমি দেখতে পেয়েছি যে এমএসডিএন-তে রেজিস্ট্রি এলিমেন্ট আকারের সীমাগুলির বিষয়ে নথিতে বলা হয়েছে যে একটি রেজিস্ট্রি কী নামের সর্বাধিক দৈর্ঘ্য 255 অক্ষর, তবে আসলে আপনি 256 টি অক্ষরের মূল নাম তৈরি করতে পারেন। যেহেতু সি-স্টাইলের স্ট্রিংটি দৈর্ঘ্যের সীমা ছাড়াই কেবল একটি পয়েন্টার, সুতরাং আমি অনুমান করি যে ইউনিকোড ফাংশনে 32,767 টি অক্ষরের একটি স্ট্রিং পাস করা সম্ভব হতে পারে CreateProcessW, এটি UNICODE_STRINGকাঠামোর মধ্যে সঠিক দৈর্ঘ্য সংরক্ষণ করতে পারে এবং উভয়ই সেট করে Lengthএবং MaximumLength65,534 এ নির্ধারণ করতে পারে এটি আইনী যুক্তি NtCreateProcess
ack ack জ্যাকি

3

উইন্ডোজ 10 এ, এটি এখনও 8191 টি অক্ষর ... কমপক্ষে আমার মেশিনে।

এটি 8191 টি অক্ষরের পরে কেবল কোনও পাঠ্য কেটে দেয়। ঠিক আছে, আসলে আমি 8196 টি অক্ষর পেয়েছি এবং 8196 এর পরে, তবে এটি আমাকে আর কোনও টাইপ করতে দেয় না।

এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা পরীক্ষা করতে পারবে যে আপনি কতক্ষণ বিবৃতি ব্যবহার করতে পারেন। ওয়েল, ধরে নিচ্ছি আপনি গোক / অ্যাডক ইনস্টল করেছেন।

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

সেমিএমডি.এক্সির সীমা এটি। উপরের উত্তরটি যেমন বলেছে, UNICODE_STRING এর কারণে আসল সীমাটি 32,768 টি অক্ষর।
অ্যালিস্টায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.