উইন্ডোজ কমান্ড ইন্টারপ্রেটার (সিএমডি.এক্সই) কীভাবে স্ক্রিপ্টগুলি পার্স করে?


142

আমি ss64.com এ গিয়েছি যা উইন্ডোজ কমান্ড ইন্টারপ্রেটার চালাবে এমন ব্যাচ স্ক্রিপ্টগুলি কীভাবে লিখতে হয় সে সম্পর্কে ভাল সহায়তা সরবরাহ করে।

তবে, ব্যাচের স্ক্রিপ্টগুলির ব্যাকরণ , কীভাবে জিনিসগুলি প্রসারিত হয় না বা প্রসারিত হয় না এবং কীভাবে জিনিস থেকে বাঁচতে হয় তার ভাল ব্যাখ্যা খুঁজে পেতে আমি অক্ষম হয়েছি ।

এখানে এমন নমুনা প্রশ্ন রয়েছে যা আমি সমাধান করতে পারিনি:

  • কোট সিস্টেমটি কীভাবে পরিচালিত হয়? আমি একটি টিনিপারল স্ক্রিপ্ট
    ( foreach $i (@ARGV) { print '*' . $i ; }) তৈরি করেছি , এটি সংকলন করেছি এবং এটিকে এটি বলেছি :
    • my_script.exe "a ""b"" c" → আউটপুট হয় *a "b*c
    • my_script.exe """a b c""" → এটি আউটপুট *"a*b*c"
  • অভ্যন্তরীণ echoকমান্ড কীভাবে কাজ করে? কমান্ডের ভিতরে কী প্রসারিত?
  • আমাকে for [...] %%Iফাইল স্ক্রিপ্টগুলিতে ব্যবহার করতে হবে তবে for [...] %Iইন্টারেক্টিভ সেশনে?
  • পালানোর চরিত্রগুলি কী এবং কোন প্রসঙ্গে? কীভাবে শতকরা চিহ্ন থেকে বাঁচবেন? উদাহরণস্বরূপ, আমি কীভাবে %PROCESSOR_ARCHITECTURE%আক্ষরিক প্রতিধ্বনি করতে পারি ? আমি খুঁজে পেয়েছি যে echo.exe %""PROCESSOR_ARCHITECTURE%কাজ করে, আরও ভাল সমাধান আছে?
  • %মিলবে কীভাবে ? উদাহরণ:
    • set b=a, echo %a %b% c%%a a c%
    • set a =b, echo %a %b% c%bb c%
  • যদি এই ভেরিয়েবলটিতে ডাবল কোট থাকে তবে আমি কীভাবে নিশ্চিত করতে পারি যে কোনও ভেরিয়েবল একক আর্গুমেন্ট হিসাবে কোনও আদেশে চলে যায়?
  • setকমান্ডটি ব্যবহার করার সময় ভেরিয়েবলগুলি কীভাবে সংরক্ষণ করা হয় ? উদাহরণস্বরূপ, যদি আমি করি set a=a" bএবং তারপর echo.%a%আমি তা গ্রহণ করি a" b। আমি তবে echo.exeআনেক্সটিলগুলি থেকে ব্যবহার করি তবে আমি পাই a b। কিভাবে %a%অন্যভাবে প্রসারিত হয়?

তোমার আলো জ্বালানোর জন্য ধন্যবাদ


উত্তর:


200

আমরা ব্যাচের স্ক্রিপ্টগুলির ব্যাকরণ তদন্ত করতে পরীক্ষা-নিরীক্ষা করেছি। আমরা ব্যাচ এবং কমান্ড লাইন মোডের মধ্যে পার্থক্যও তদন্ত করেছি।

ব্যাচ লাইন পার্সার:

এখানে ব্যাচ ফাইল লাইন পার্সারের পর্যায়গুলির সংক্ষিপ্ত বিবরণ দেওয়া হল:

পর্ব 0) লাইন পড়ুন:

পর্ব 1) শতাংশ সম্প্রসারণ:

দ্বিতীয় পর্যায়) বিশেষ অক্ষরগুলি প্রক্রিয়াকরণ করুন, টোকেনাইজ করুন এবং ক্যাশেড কমান্ড ব্লক তৈরি করুন: এটি একটি জটিল প্রক্রিয়া যা উদ্ধৃতি, বিশেষ অক্ষর, টোকেন ডিলিমিটার এবং ক্যারেট পলায়নের মতো জিনিস দ্বারা প্রভাবিত হয়।

ধাপ 3) পার্সড কমান্ড (গুলি) কেবলমাত্র কমান্ড ব্লক দিয়ে শুরু না @হলে পূর্ববর্তী পদক্ষেপের শুরুতে ECHO চালু ছিল E

চতুর্থ পর্যায়) %Xপরিবর্তনশীল প্রসারণের জন্য: কেবলমাত্র একটি ফর কমান্ড সক্রিয় থাকলে এবং ডিও-র পরে কমান্ডগুলি প্রক্রিয়াজাত হয়।

পর্ব 5) বিলম্বিত সম্প্রসারণ: কেবলমাত্র বিলম্বিত প্রসারণ সক্ষম করা থাকলে

ফেজ 5.3) পাইপ প্রসেসিং: কেবলমাত্র পাইপের উভয় পাশে কমান্ডগুলি থাকলে

পর্যায় 5.5) পুনর্নির্দেশ কার্যকর করুন:

পর্যায় 6) কল প্রক্রিয়াকরণ / ক্যারেট দ্বিগুণকরণ: কমান্ড টোকেনটি যদি কল হয় তবেই

ফেজ 7) এক্সিকিউট: কমান্ডটি কার্যকর করা হয়


প্রতিটি পর্যায়ের বিশদ এখানে:

নোট করুন যে নীচে বর্ণিত পর্যায়গুলি ব্যাচ পার্সার কীভাবে কাজ করে তার একমাত্র মডেল। প্রকৃত সেন্টিমিডি.এক্সই ইন্টার্নালগুলি এই পর্যায়গুলি প্রতিফলিত করতে পারে না। তবে এই মডেলটি ব্যাচের স্ক্রিপ্টগুলির আচরণের পূর্বাভাস দেওয়ার ক্ষেত্রে কার্যকর।

পর্ব 0) লাইন পড়ুন: প্রথমে ইনপুট পড়ুন <LF>

  • কমান্ড হিসাবে পার্স করার জন্য একটি লাইন পড়ার সময় <Ctrl-Z>(0x1A) <LF>(লাইনফিড 0x0A) হিসাবে পড়া হয়
  • যখন GOTO বা CALL লাইনগুলি যখন স্ক্যান করার সময় পড়বে: লেবেলটিকে, <Ctrl-Z>নিজেকে হিসাবে ধরা হয় - তখন রূপান্তরিত হয় না<LF>

পর্ব 1) শতাংশ সম্প্রসারণ:

  • একটি ডাবল %%একটি একক দ্বারা প্রতিস্থাপিত হয়%
  • আর্গুমেন্ট সম্প্রসারণ ( %*, %1, %2, ইত্যাদি)
  • এর প্রসারণ %var%, যদি var না থাকে তবে এটিকে কিছুই দিয়ে প্রতিস্থাপন করুন
  • লাইনটি প্রথমে ছড়িয়ে দেওয়া হয় প্রসারণের <LF>মধ্যে নয়%var%
  • সম্পূর্ণ ব্যাখ্যার জন্য ডাবেনহাম একই থ্রেড থেকে এর প্রথমার্ধটি পড়ুন : পার্সেন্ট ফেজ

দ্বিতীয় পর্যায়) বিশেষ অক্ষরগুলি প্রক্রিয়াকরণ করুন, টোকেনাইজ করুন এবং ক্যাশেড কমান্ড ব্লক তৈরি করুন: এটি একটি জটিল প্রক্রিয়া যা উদ্ধৃতি, বিশেষ অক্ষর, টোকেন ডিলিমিটার এবং ক্যারেট পলায়নের মতো জিনিস দ্বারা প্রভাবিত হয়। নিম্নলিখিতটি এই প্রক্রিয়াটির একটি আনুমানিক is

এই ধাপ জুড়ে রয়েছে এমন ধারণাগুলি গুরুত্বপূর্ণ।

  • একটি টোকেন কেবল অক্ষরের একটি স্ট্রিং যা ইউনিট হিসাবে বিবেচিত হয়।
  • টোকেনগুলি টোকেন ডিলিমিটারদের দ্বারা পৃথক করা হয়। স্ট্যান্ডার্ড টোকেন ডিলিমিটারগুলি <space> <tab> ; , = <0x0B> <0x0C>এবং <0xFF>
    ক্রমাগত টোকেন ডিলিমিটারকে এক হিসাবে বিবেচনা করা হয় - টোকেন ডিলিমিটারগুলির মধ্যে কোনও খালি টোকেন নেই
  • উদ্ধৃত স্ট্রিংয়ের মধ্যে কোনও টোকেন ডিলিমিটার নেই। সম্পূর্ণ উদ্ধৃত স্ট্রিংটি সর্বদা একক টোকেনের অংশ হিসাবে বিবেচিত হয়। একটি একক টোকনে উদ্ধৃত স্ট্রিং এবং অব্যক্ত অক্ষরের সংমিশ্রণ থাকতে পারে।

নীচের অক্ষরগুলির প্রসঙ্গের উপর নির্ভর করে এই পর্যায়ে বিশেষ অর্থ হতে পারে: <CR> ^ ( @ & | < > <LF> <space> <tab> ; , = <0x0B> <0x0C> <0xFF>

বাম থেকে ডানে প্রতিটি চরিত্রটি দেখুন:

  • তবে <CR>যদি এটি মুছে ফেলুন, যেন এটি কখনও ছিল না (অদ্ভুত পুনঃনির্দেশ আচরণ ব্যতীত )
  • যদি একটি ক্যারেট ( ^) হয়, তবে পরবর্তী অক্ষরটি পালিয়ে যায় এবং পালানোর ক্যারেটটি সরিয়ে ফেলা হয়। পালানো অক্ষরগুলি সমস্ত বিশেষ অর্থ (বাদে <LF>) হারায় ।
  • যদি একটি উদ্ধৃতি ( ") হয়, উদ্ধৃতি পতাকা টগল করুন। যদি উদ্ধৃতি পতাকাটি সক্রিয় থাকে তবে কেবলমাত্র "এবং <LF>বিশেষ। পরবর্তী উক্তিটি উদ্ধৃতি পতাকাটি টগল না করা পর্যন্ত অন্যান্য সমস্ত অক্ষর তাদের বিশেষ অর্থ হারাবে। সমাপনী উদ্ধৃতিটি এড়ানো সম্ভব নয়। সমস্ত উদ্ধৃত অক্ষর সর্বদা একই টোকেনের মধ্যে থাকে।
  • <LF>সর্বদা উদ্ধৃতি পতাকাটি বন্ধ করে দেয়। অন্যান্য আচরণ প্রসঙ্গের উপর নির্ভর করে পরিবর্তিত হয়, কিন্তু উদ্ধৃতিগুলি কখনই এর আচরণকে পরিবর্তন করে না <LF>
    • পলান <LF>
      • <LF> ছিনিয়ে নেওয়া হয়
      • পরের চরিত্রটি পালিয়ে যায়। যদি লাইন বাফার শেষে থাকে, তবে পরের লাইনটি 1 এবং 1.5 পর্যায়ক্রমে পড়া এবং প্রক্রিয়াজাত করা হবে এবং পরবর্তী অক্ষরটি থেকে বেরিয়ে যাওয়ার আগে বর্তমানের সাথে যুক্ত করা হবে। যদি পরবর্তী চরিত্রটি হয় <LF>, তবে এটি আক্ষরিক হিসাবে বিবেচিত হবে, যার অর্থ এই প্রক্রিয়াটি পুনরাবৃত্তিযোগ্য নয়।
    • আনুষঙ্গিকভাবে <LF>বন্ধনীর মধ্যে নেই
      • <LF> কেটে ফেলা হয় এবং বর্তমান লাইনের পার্সিং সমাপ্ত হয়।
      • লাইন বাফারে থাকা কোনও অক্ষর সহজভাবে উপেক্ষা করা হয়।
    • <LF>একটি ফর ইন প্যারেন্থাইজড ব্লকের মধ্যে আনসকেপড
      • <LF> এ রূপান্তরিত হয় a <space>
      • যদি লাইন বাফার শেষে থাকে, তবে পরের লাইনটি পড়তে হবে এবং বর্তমানের সাথে সংযুক্ত করা হবে।
    • প্রথম <LF>বন্ধনীযুক্ত কমান্ড ব্লকের মধ্যে আনসকেপড
      • <LF>রূপান্তরিত হয় <LF><space>, এবং <space>কমান্ড ব্লকের পরবর্তী লাইনের অংশ হিসাবে বিবেচিত হয়।
      • যদি লাইন বাফার শেষে থাকে, তবে পরের লাইনটি পড়তে এবং স্পেসে সংযুক্ত করা হয়।
  • যদি বিশেষ চরিত্রগুলির মধ্যে একটি & | <বা >, পাইপ, কমান্ড কনকেন্টেশন এবং পুনঃনির্দেশ পরিচালনা করতে এই বিন্দুতে লাইনটি বিভক্ত করুন।
    • পাইপ ( |) এর ক্ষেত্রে , প্রতিটি পক্ষই একটি পৃথক কমান্ড (বা কমান্ড ব্লক) যা 5 ম পর্যায়ে বিশেষ পরিচালনা করে
    • ক্ষেত্রে &, &&অথবা ||কমান্ড সংযুক্তকরণের, সংযুক্তকরণের প্রতিটি পাশ আলাদা কমান্ড হিসাবে গণ্য হবে।
    • ক্ষেত্রে <, <<, >, অথবা >>ফেরৎ, ফেরৎ দফা পার্স করা হয়, সাময়িকভাবে সরানো, এবং তারপর বর্তমান কমান্ড শেষে যোগ করা। একটি পুনঃনির্দেশের ধারাটিতে একটি alচ্ছিক ফাইল হ্যান্ডেল ডিজিট, পুনর্নির্দেশ অপারেটর এবং পুনঃনির্দেশ গন্তব্য টোকন থাকে।
      • পুনঃনির্দেশ অপারেটরের পূর্ববর্তী টোকেনটি যদি একটি একক অচিহ্নযুক্ত অঙ্ক হয়, তবে অঙ্কটি পুনঃনির্দেশিত হওয়ার জন্য ফাইল হ্যান্ডেলটি নির্দিষ্ট করে। যদি হ্যান্ডেল টোকেনটি খুঁজে পাওয়া যায় না, তবে আউটপুট পুনর্নির্দেশটিকে ডিফল্ট 1 (স্টাডআউট), এবং ইনপুট পুনর্নির্দেশকে ডিফল্ট 0 (স্টিডিন) করতে হবে।
  • যদি এই কমান্ডের (প্রথম দিকে পুনর্নির্দেশের আগে যাওয়ার আগে) প্রথম চিহ্নটি শুরু হয় @, তবে @এর বিশেষ অর্থ রয়েছে has ( @অন্য কোনও প্রসঙ্গে বিশেষ নয়)
    • বিশেষ @সরানো হয়।
    • যদি ECHO চালু থাকে, তবে এই কমান্ডটি এই রেখার উপরের কোনও নিম্নোক্ত কমান্ডের সাথে পর্ব 3 প্রতিধ্বনির বাইরে থাকবে। যদি এটি @একটি খোলার আগে হয় (, তবে পুরো বন্ধনীবদ্ধ ব্লকটি 3 ম এর প্রতিধ্বনি থেকে বাদ দেওয়া হবে।
  • প্রক্রিয়া বন্ধনী (একাধিক লাইন জুড়ে যৌগিক বিবৃতি প্রদান করে):
    • পার্সার যদি কমান্ড টোকেনটির সন্ধান (না করে তবে বিশেষ নয়।
    • পার্সার যদি কোনও কমান্ড টোকেন সন্ধান করে এবং এটি সন্ধান করে (তবে একটি নতুন যৌগিক বিবৃতি শুরু করুন এবং প্রথম বন্ধনী কাউন্টারটি বাড়ান
    • যদি প্রথম বন্ধনী> 0 হয় তবে )যৌগিক স্টেটমেন্টটি বন্ধ করে দেয় এবং প্রথম বন্ধনী কাউন্টারকে হ্রাস করে।
    • যদি রেখার শেষটি পৌঁছে যায় এবং প্রথম বন্ধনী> 0 হয় তবে পরবর্তী লাইনটি যৌগিক বিবৃতিতে সংযুক্ত করা হবে (পর্ব 0 দিয়ে আবার শুরু হবে)
    • যদি প্রথম বন্ধনী কাউন্টার 0 হয় এবং পার্সার একটি কমান্ড সন্ধান করছে, তবে যতক্ষণ না তা অবিলম্বে টোকেন ডিলিমিটার, বিশেষ অক্ষর, নিউলাইন বা ফাইল-এর-শেষের পরে অনুসরণ করা হবে ততক্ষণ )একটি REMবিবৃতিটির অনুরূপ কাজ করবে
      • সমস্ত বিশেষ অক্ষরগুলি বাদ দিয়ে তার অর্থ হারাবে ^(লাইন সংক্ষিপ্তকরণ সম্ভব)
      • লজিকাল লাইনের শেষে পৌঁছে গেলে পুরো "কমান্ড" ফেলে দেওয়া হয়।
  • প্রতিটি কমান্ড টোকেনের একটি সিরিজে বিভক্ত হয়। প্রথম টোকেনটি সর্বদা কমান্ড টোকেন হিসাবে বিবেচিত হয় (বিশেষের পরে কেটে ফেলা @হয় এবং শেষে পুনঃনির্দেশ) সরানো হয়।
    • কমান্ড টোকেনের আগে শীর্ষস্থানীয় টোকেন ডিলিমিটারগুলি কেটে নেওয়া হয়
    • কমান্ড টোকেনকে বিশ্লেষণ (করার সময়, মানক টোকেন ডিলিমিটারগুলি ছাড়াও কমান্ড টোকেন ডিলিমিটার হিসাবে কাজ করে
    • পরবর্তী টোকেন পরিচালনা করা কমান্ডের উপর নির্ভর করে।
  • কমান্ড টোকেনের পরে একক আর্গুমেন্ট টোকেন দেওয়ার পরে সর্বাধিক কমান্ডগুলি সমস্ত আর্গুমেন্টকে সহজেই যুক্ত করে। সমস্ত আর্গুমেন্ট টোকেন ডিলিমিটারগুলি সংরক্ষিত। আর্গুমেন্ট অপশনগুলি সাধারণত ফেজ 7 পর্যন্ত পার্স করা হয় না।
  • তিনটি কমান্ড বিশেষ হ্যান্ডলিং পান - যদি, ফর, এবং আরইএম
    • আইএফ দুটি বা তিনটি পৃথক অংশে বিভক্ত হয়ে থাকে যা স্বাধীনভাবে প্রক্রিয়া করা হয়। আইএফ নির্মাণে একটি বাক্য গঠন ত্রুটির ফলে মারাত্মক সিনট্যাক্স ত্রুটি হবে।
      • তুলনা অপারেশন হ'ল আসল কমান্ড যা phase ষ্ঠ পর্যায়ে প্রবাহিত হয়
        • সমস্ত আইএফ বিকল্পগুলি দ্বিতীয় পর্যায়ে সম্পূর্ণরূপে পার্স করা হয়েছে।
        • ধারাবাহিক টোকেন ডিলিমিটারগুলি একটি একক জায়গায়।
        • তুলনা অপারেটরের উপর নির্ভর করে সনাক্ত করা যায় এমন এক বা দুটি মান টোকেন থাকবে।
      • ট্রু কমান্ড ব্লক শর্তের পরে কমান্ডের সেট এবং অন্য কোনও কমান্ড ব্লকের মতো পার্স করা হয়। যদি ELSE ব্যবহার করতে হয় তবে সত্যিকারের ব্লকটি অবশ্যই প্রথম বন্ধনীরূপে তৈরি করা উচিত।
      • Lচ্ছিক মিথ্যা কমান্ড ব্লক হ'ল ELSE এর পরে কমান্ডের সেট। আবার এই কমান্ড ব্লকটি স্বাভাবিকভাবে পার্স করা হয়।
      • সত্য এবং মিথ্যা কমান্ড ব্লকগুলি স্বয়ংক্রিয়ভাবে পরবর্তী পর্যায়ে প্রবাহিত হয় না। তাদের পরবর্তী প্রক্রিয়াকরণটি 7 ম ধাপের দ্বারা নিয়ন্ত্রিত।
    • ডিওয়ের পরে দু'ভাগে বিভক্ত হয়ে যায়। নির্মাণের ক্ষেত্রে একটি সিনট্যাক্স ত্রুটির ফলে মারাত্মক সিনট্যাক্স ত্রুটি হবে।
      • ডিও এর মাধ্যমে অংশটি হ'ল আসল ফর পুনরাবৃত্তি কমান্ড যা phase ধাপের মধ্য দিয়ে প্রবাহিত হয়
        • সমস্ত বিকল্প বিকল্পগুলি দ্বিতীয় পর্যায়ে সম্পূর্ণরূপে পার্স করা হয়েছে।
        • আইএন প্রথম বন্ধনীযুক্ত ধারা <LF>হিসাবে আচরণ করে <space>। আইএন ক্লজটি পার্স করার পরে, সমস্ত টোকেনগুলি একত্রে একত্রিত হয়ে একটি টোকেন গঠন করে।
        • ধারাবাহিকভাবে অপরিবর্তিত / অপ্রকাশিত টোকেন ডিলিমিটারগুলি ডিও এর মাধ্যমে ফর কমান্ড জুড়ে একটি একক জায়গায় collapse
      • ডিওয়ের পরে থাকা অংশটি একটি কমান্ড ব্লক যা সাধারণত পার্স করা হয়। ডিও কমান্ড ব্লকের পরবর্তী প্রক্রিয়াকরণটি পর্যায় 7 এর পুনরাবৃত্তির দ্বারা বিযুক্ত করা হয়।
    • দ্বিতীয় ধাপে সনাক্ত করা আরইএম অন্যান্য কমান্ডের চেয়ে নাটকীয়ভাবে পৃথক করা হয়।
      • শুধুমাত্র একটি যুক্তি টোকেন পার্স করা হয়েছে - প্রথম যুক্তি টোকেন পরে পার্সার অক্ষর উপেক্ষা করে।
      • আরইএম কমান্ডটি ফেজ 3 আউটপুটে উপস্থিত হতে পারে তবে কমান্ডটি কখনই কার্যকর হয় না এবং মূল যুক্তির পাঠ্য প্রতিধ্বনিত হয় - এস্কেপিং ক্যারেটগুলি সরানো হয় না ...
        • যদি একটি মাত্র আর্গুমেন্ট টোকেন থাকে যা একটি অনির্বাচিত ^দিয়ে শেষ হয় যা লাইনটি শেষ করে, তবে আর্গুমেন্ট টোকেনটি ফেলে দেওয়া হয়, এবং পরবর্তী লাইনটি পার্স করে REM এ সংযুক্ত করা হয়। একাধিক টোকেন না থাকলে বা শেষ চরিত্রটি না হওয়া পর্যন্ত এটি পুনরাবৃত্তি করে ^
  • যদি কমান্ড টোকেনটি শুরু হয় :এবং এটি দ্বিতীয় পর্বের প্রথম রাউন্ড ((ধাপে কল করার কারণে পুনরায় আরম্ভ নয়) তবে
    • টোকেনটি সাধারণত একটি অনিবন্ধিত লেবেল হিসাবে বিবেচিত হয় ।
      • লাইন বাকি পার্স করা হয়, তবে ), <, >, &এবং |আর বিশেষ অর্থ আছে। লাইনের পুরো অবশিষ্টটি "কমান্ড" লেবেলের অংশ হিসাবে বিবেচিত হয়।
      • ^বিশেষ হতে, যার অর্থ যে লাইন ধারাবাহিকতা লেবেলে পরবর্তী পংক্তির শেষে ব্যবহার করা যেতে পারে চলতে থাকে।
      • প্রথম পংক্তিতে অবিলম্বে কোনও আদেশ বা এক্সিকিউটেড লেবেল অনুসরণ না করা হলে প্রথম বন্ধনীযুক্ত ব্লকের মধ্যে একটি অব্যবহৃত লেবেল মারাত্মক সিনট্যাক্স ত্রুটির কারণ হতে পারে ।
        • (অব্যক্ত লেবেল অনুসরণকারী প্রথম কমান্ডটির আর বিশেষ অর্থ নেই ।
      • লেবেল বিশ্লেষণ সম্পূর্ণ হওয়ার পরে কমান্ডটি বাতিল করা হয়েছে। পরবর্তী স্তরগুলি লেবেলের জন্য স্থান নেয় না
    • তিনটি ব্যতিক্রম রয়েছে যার ফলে দ্বিতীয় পর্যায়ে পাওয়া লেবেলকে এক্সিকিউটেড লেবেল হিসাবে গণ্য করা যেতে পারে যা phase ধাপের মধ্য দিয়ে পার্স করা অব্যাহত রয়েছে।
      • সেখানে ফেরৎ যে তার আগে বসেছে ট্যাগ টোকেনটি, এবং সেখানে একটি হল |নল বা &, &&অথবা ||লাইনে কমান্ড সংযুক্তকরণের।
      • এখানে পুনঃনির্দেশ রয়েছে যা লেবেল টোকেনের আগে এবং কমান্ডটি প্রথম বন্ধনী ব্লকের মধ্যে রয়েছে।
      • প্রথম বন্ধনযুক্ত ব্লকের মধ্যে একটি রেখার উপরে লেবেল টোকেন হ'ল প্রথম কমান্ড, এবং উপরের লাইনটি একটি নিরবিচ্ছিন্ন লেবেল দিয়ে শেষ হয়েছে ।
    • যখন দ্বিতীয় পর্যায়ে এক্সিকিউটেড লেবেল আবিষ্কার করা হয় তখন নিম্নলিখিতটি ঘটে
      • লেবেল, তার আর্গুমেন্টগুলি এবং এর পুনঃনির্দেশগুলি 3 য় পর্যায়ে কোনও প্রতিধ্বনি আউটপুট থেকে বাদ দেওয়া হয়েছে
      • লাইনে পরবর্তী কোনও সংক্ষিপ্ত কমান্ড সম্পূর্ণরূপে বিশ্লেষণ এবং সম্পাদন করা হয়।
    • সম্পর্কে আরও তথ্যের জন্য শাস্তিপ্রাপ্ত লেবেলসমূহ বনাম অসম্পন্ন লেবেলসমূহ দেখুন https://www.dostips.com/forum/viewtopic.php?f=3&t=3803&p=55405#p55405

ধাপ 3) পার্সড কমান্ড (গুলি) কেবলমাত্র কমান্ড ব্লক দিয়ে শুরু না @হলে পূর্ববর্তী পদক্ষেপের শুরুতে ECHO চালু ছিল E

চতুর্থ পর্যায়) %Xপরিবর্তনশীল প্রসারণের জন্য: কেবলমাত্র একটি ফর কমান্ড সক্রিয় থাকলে এবং ডিও-র পরে কমান্ডগুলি প্রক্রিয়াজাত হয়।

  • এই মুহুর্তে, ব্যাচ প্রসেসিং ফেজ 1 জনকে ইতিমধ্যে পরিবর্তনশীল মত রূপান্তরিত হবে %%Xমধ্যে %X। কমান্ড লাইনটির প্রথম ধাপের জন্য বিভিন্ন শতাংশ প্রসারণ বিধি রয়েছে This এটি কারণ হ'ল কমান্ড লাইনগুলি ব্যবহার করে %Xতবে ব্যাচ ফাইলগুলি %%Xভেরিয়েবলের জন্য ব্যবহার করে ।
  • পরিবর্তনশীল নামগুলির জন্য কেস সংবেদনশীল তবে ~modifiersকেস সংবেদনশীল নয়।
  • ~modifiersপরিবর্তনশীল নামের চেয়ে অগ্রাধিকার নিন। নিম্নলিখিত বর্ণের অক্ষর যদি একটি ~পরিবর্তনকারী এবং বৈকল্পিক নামের জন্য বৈধ উভয় হয় এবং এর পরে একটি অক্ষর বিদ্যমান থাকে যা ভেরিয়েবল নামের জন্য সক্রিয় থাকে, তবে অক্ষরটি সংশোধক হিসাবে ব্যাখ্যা করা হয়।
  • পরিবর্তনশীল নামগুলির জন্য বিশ্বব্যাপী, তবে কেবল একটি ডিও ক্লজের প্রসঙ্গে। যদি কোনও রুটিন একটি ডিও শর্তের মধ্যে থেকে কল করা হয়, তবে ফোর ভেরিয়েবলগুলি কল কলের রুটিনের মধ্যে প্রসারিত হয় না। কিন্তু যদি রুটিন নিজস্ব জন্য কমান্ড আছে, তারপর সব বর্তমানে ভেরিয়েবল জন্য সংজ্ঞায়িত ভেতরের আপনি কি কমান্ড অ্যাক্সেস করা যায়।
  • পরিবর্তিত নামগুলির জন্য নেস্টেড ফোর্সগুলির মধ্যে পুনরায় ব্যবহার করা যেতে পারে। অভ্যন্তরীণ ফর মানটি অগ্রাধিকার গ্রহণ করে, তবে একবার INNER for বন্ধ হয়ে গেলে বাহ্যিক ফর মান পুনরুদ্ধার করা হয়।
  • যদি এই পর্বের শুরুতে ECHO চালু ছিল, তবে ফেজ 3) ফোর ভেরিয়েবলগুলি প্রসারিত হওয়ার পরে পার্সড ডিও কমান্ডগুলি দেখানোর জন্য পুনরাবৃত্তি করা হয়।

---- এই দিক থেকে, দ্বিতীয় পর্বে চিহ্নিত প্রতিটি কমান্ড পৃথকভাবে প্রক্রিয়া করা হবে।
---- পরের দিকে যাওয়ার আগে একটি কমান্ডের জন্য 5 থেকে 7 পর্যায়ের পর্যায়গুলি সম্পন্ন হয়।

পর্ব 5) বিলম্বিত সম্প্রসারণ: কেবলমাত্র বিলম্বিত প্রসারণ চালু থাকলে, কমান্ডটি পাইপের উভয় পাশের বন্ধুত্বযুক্ত ব্লকের মধ্যে নেই এবং কমান্ডটি একটি "নগ্ন" ব্যাচের স্ক্রিপ্ট নয় (বন্ধনীর বাইরে স্ক্রিপ্টের নাম, CALL, কমান্ড কনটেনটেশন, বা পাইপ)।

  • কমান্ডের প্রতিটি টোকেন স্বাধীনভাবে বিলম্বিত প্রসারণের জন্য পার্স করা হয়।
    • বেশিরভাগ কমান্ড দুটি বা ততোধিক টোকেনকে বিশ্লেষণ করে - কমান্ড টোকেন, আর্গুমেন্ট টোকেন এবং প্রতিটি পুনর্নির্দেশ গন্তব্য টোকেন।
    • ফর কমান্ডটি কেবল আইএন ক্লজ টোকেনকে পার্স করে।
    • আইএফ কমান্ড তুলনা মানগুলি কেবল পার্স করে - তুলনা অপারেটরের উপর নির্ভর করে এক বা দুটি হয়।
  • প্রতিটি পার্সড টোকেনের জন্য, প্রথমে এটি কোনও রয়েছে কিনা তা পরীক্ষা করুন !। যদি তা না হয় তবে টোকেনটি বিশ্লেষণ করা হবে না - ^অক্ষরের জন্য গুরুত্বপূর্ণ । যদি টোকেনটিতে থাকে !, তবে প্রতিটি অক্ষর বাম থেকে ডানে স্ক্যান করুন:
    • যদি এটি একটি ক্যারেট ( ^) হয় তবে পরের চরিত্রটির কোনও বিশেষ অর্থ নেই, ক্যারেটটি নিজেই সরানো হবে
    • যদি এটি বিস্ময়কর চিহ্ন হয় তবে পরবর্তী বিস্মরণ চিহ্নটি অনুসন্ধান করুন (ক্যারেটগুলি আর পর্যবেক্ষণ করা হয় না), ভেরিয়েবলের মানটিতে প্রসারিত করুন।
      • ধারাবাহিক উদ্বোধনটি !একটি একক হয়ে পড়েছে!
      • অপরিশোধিত যেকোন অবশিষ্ট !অপসারণ করা হয়েছে
    • এই পর্যায়ে ভারগুলি প্রসারিত করা "নিরাপদ", কারণ বিশেষ অক্ষরগুলি আর সনাক্ত করা যায় না (এমনকি <CR>বা <LF>)
    • আরও সম্পূর্ণ ব্যাখ্যার জন্য ডাবেনহ্যাম একই থ্রেড - এক্সক্লিমেশন পয়েন্ট ফেজ থেকে এর দ্বিতীয়ার্ধটি পড়ুন

ফেজ 5.3) পাইপ প্রসেসিং: কেবলমাত্র পাইপের উভয় পাশের কমান্ডগুলি থাকলে পাইপের
প্রতিটি পাশই স্বতন্ত্র এবং অ্যাসিনক্রোনাকলভাবে প্রক্রিয়াজাত হয়।

  • যদি কমান্ডটি cmd.exe এর অভ্যন্তরীণ হয়, বা এটি একটি ব্যাচ ফাইল, বা যদি এটি একটি প্রথম বন্ধনীযুক্ত কমান্ড ব্লক হয় তবে এটি একটি নতুন cmd.exe থ্রেডের মাধ্যমে কার্যকর করা হয় %comspec% /S /D /c" commandBlock", সুতরাং কমান্ড ব্লকটি একটি ফেজ পুনঃসূচনা পায় তবে এইবার কমান্ড লাইন মোডে।
    • যদি প্রথম বন্ধনীযুক্ত কমান্ডটি অবরুদ্ধ করে থাকে, তারপরে <LF>এবং পরে সমস্ত কমান্ড সহ রূপান্তরিত হয় <space>&। অন্য <LF>ছিনতাই হয়।
  • এটি পাইপ কমান্ডগুলির প্রক্রিয়াজাতকরণের সমাপ্তি।
  • দেখুন কেন বিলম্বিত সম্প্রসারণ ব্যর্থ যখন কোডের পাইপ ব্লক ভিতরে? পাইপ পার্সিং এবং প্রক্রিয়াজাতকরণ সম্পর্কে আরও তথ্যের জন্য

ফেজ 5.5) পুনর্নির্দেশ কার্যকর করুন: দ্বিতীয় ধাপে আবিষ্কার করা যে কোনও পুনর্নির্দেশটি এখন কার্যকর করা হয়েছে।

ধাপ)) কল প্রক্রিয়াকরণ / ক্যারেট দ্বিগুণকরণ: কেবলমাত্র কমান্ড টোকেনটি কল করা হয়, বা যদি প্রথম ঘটনাক্রমে স্ট্যান্ডার্ড টোকেন ডিলিমিটারের পূর্বে পাঠ্য কল হয়। যদি CALL বৃহত্তর কমান্ড টোকেন থেকে পার্স করা হয়, তবে অব্যবহৃত অংশটি এগিয়ে যাওয়ার আগে আর্গুমেন্টের টোকেনটিতে চাপানো হবে।

  • একটি অব্যক্ত জন্য আর্গুমেন্ট টোকেন স্ক্যান /?। যদি টোকেনের মধ্যে কোথাও পাওয়া যায়, তবে phase ম পর্যায় বাতিল করুন এবং। ধাপে এগিয়ে যান, যেখানে কলের জন্য সহায়তা প্রিন্ট করা হবে।
  • প্রথমটি সরিয়ে ফেলুন CALL, যাতে একাধিক কল স্ট্যাক করা যায়
  • সমস্ত কেরেটের দ্বিগুণ
  • 1, 1.5 এবং 2 পর্যায়গুলি পুনরায় চালু করুন, তবে 3 ধাপে চালিয়ে যান না
    • যে কোনও দ্বিগুণ ক্যারেট যতক্ষণ না উদ্ধৃত হয় ততক্ষণ একটি ক্যারেটে ফিরে আসবে। তবে দুর্ভাগ্যক্রমে, উদ্ধৃত ক্যারেটগুলি দ্বিগুণ থেকে যায়।
    • পর্ব 1 কিছুটা পরিবর্তন হয়েছে
      • 1.2 বা 1.3 ধাপে সম্প্রসারণ ত্রুটিগুলি CALL বাতিল করে দেয় তবে ত্রুটিটি মারাত্মক নয় - ব্যাচ প্রক্রিয়াজাতকরণ অব্যাহত থাকে।
    • দ্বিতীয় ধাপের কাজগুলি কিছুটা পরিবর্তন করা হয়েছে
      • দ্বিতীয় ধাপের প্রথম রাউন্ডে সনাক্ত করা হয়নি এমন যে কোনও নতুন প্রদর্শিত, অব্যক্ত, অব্যাহত পুনঃনির্দেশ সনাক্ত করা হয়েছে তবে এটি পুনরায় নির্দেশনা সম্পাদন না করে (ফাইলের নাম সহ) মুছে ফেলা হয়েছে
      • লাইনটির শেষে যে কোনও সদ্য উপস্থিত হওয়া অব্যক্ত, অব্যাহত ক্যারেট লাইনের ধারাবাহিকতা না করে সরানো হবে
      • নিম্নলিখিতগুলির কোনও সনাক্ত করা থাকলে সিএএলএল ত্রুটি ছাড়াই বাতিল করা হয় is
        • নতুনভাবে হাজির হচ্ছে অব্যবহৃত, অনির্বাচিত &বা|
        • ফলস্বরূপ কমান্ড টোকেন শুরু হয় অব্যক্ত, অপরিবর্তিত ছাড়াই (
        • সরানো কলটির পরে খুব প্রথম টোকেনটি শুরু হয়েছিল @
      • পরিসমাপ্তি কমান্ড একটি আপাতদৃষ্টিতে বৈধ যদি বা হয়, তাহলে মৃত্যুদন্ড পরবর্তীকালে জানায় একটি ত্রুটি ঘটেছে যার ব্যর্থ হয়ে যাবে IFবা FORএকটি অভ্যন্তরীণ অথবা বহিরাগত কমান্ড হিসাবে স্বীকৃত নয়।
      • অবশ্যই কল অফ ফেস 2 এই 2nd রাউন্ডে বাতিল করা হয় না পরিসমাপ্তি কমান্ড টোকেন সঙ্গে একটি লেবেল শুরুতে যদি :
  • ফলস্বরূপ কমান্ড টোকেনটি যদি কল হয়, তবে ফেজ rest পুনরায় চালু করুন (আর কোনও কল না করা পর্যন্ত পুনরাবৃত্তি হবে)
  • ফলস্বরূপ কমান্ড টোকেনটি যদি একটি ব্যাচের স্ক্রিপ্ট বা একটি: লেবেল হয়, তবে সিএএলএল এর সম্পাদন সম্পূর্ণরূপে ফেজ of এর বাকী দ্বারা পরিচালিত হবে।
    • কল স্ট্যাকের বর্তমান ব্যাচ স্ক্রিপ্ট ফাইল অবস্থানটি পুশ করুন যাতে CALL শেষ হয়ে গেলে কার্যকর অবস্থানটি সঠিক অবস্থান থেকে শুরু করতে পারে।
    • সমস্ত ফলস্বরূপ টোকেন ব্যবহার করে CALL এর জন্য% 0,% 1,% 2, ...% N এবং% * আর্গুমেন্ট টোকেন সেটআপ করুন
    • কমান্ড টোকেন যদি এমন একটি লেবেল থাকে যা দিয়ে শুরু হয় :, তবে
      • পুনঃসূচনা 5 ম পর্যায় 5 এটি প্রভাব ফেলতে পারে: লেবেলটি কল করা হয়। % 0 ইত্যাদি টোকেনগুলি ইতিমধ্যে সেটআপ হয়ে গেছে বলে এটি কল আউট রুটিনে পাস হওয়া আর্গুমেন্টগুলিকে পরিবর্তন করবে না।
      • সাবরোটিনের শুরুতে ফাইল পয়েন্টারটির অবস্থান নির্ধারণের জন্য গোটো লেবেল সম্পাদন করুন (অন্য কোনও টোকেন যা লেবেল অনুসরণ করতে পারে তা উপেক্ষা করুন) গোটো কীভাবে কাজ করে তার নিয়মের জন্য পর্যায় 7 দেখুন See
        • যদি: লেবেল টোকেন অনুপস্থিত, বা: লেবেলটি পাওয়া যায় না, তবে সংরক্ষিত ফাইলের অবস্থান পুনরুদ্ধার করার জন্য কল স্ট্যাকটি তত্ক্ষণাত পপড হয়ে যায়, এবং CALL বাতিল করে দেওয়া হয়।
        • যদি: লেবেলটি ধারণ করে / ?, হয়, তবে GOTO সহায়তা: লেবেল অনুসন্ধানের পরিবর্তে মুদ্রণ করা হবে। ফাইল পয়েন্টারটি সরে না, যেমন কোডটি সিএলএল দু'বার কার্যকর হওয়ার পরে একবার CALL প্রসঙ্গে এবং তারপরে আবার CALL ফেরার পরে আসে। দেখুন কেন এই কলটিতে কল কল সাহায্যের বার্তা মুদ্রণ করে? এবং এরপরে কমান্ডটি কেন দু'বার কার্যকর করা হবে? আরও তথ্যের জন্য.
    • অন্যথায় নির্দিষ্ট ব্যাচের স্ক্রিপ্টে স্থানান্তর নিয়ন্ত্রণ।
    • CALLed এর এক্সিকিউশন: লেবেল বা স্ক্রিপ্ট অব্যাহত থাকে যতক্ষণ না হয় Exit / B বা ফাইলের শেষের দিকে পৌঁছে যায়, এই পর্যায়ে CALL স্ট্যাকটি পপ হয় এবং সংরক্ষণকৃত ফাইল অবস্থান থেকে সম্পাদন পুনরায় শুরু হয়।
      কল প্লে স্ক্রিপ্ট বা: লেবেলের জন্য 7 ম পর্যায় কার্যকর করা হয় না।
  • অন্য phase ধাপের ফলাফল কার্যকর করার জন্য phase ধাপের মধ্যে পড়ে।

ফেজ 7) এক্সিকিউট: কমান্ডটি কার্যকর করা হয়

  • 7.1 - অভ্যন্তরীণ কমান্ড কার্যকর করুন - যদি কমান্ড টোকেনটি উদ্ধৃত হয়, তবে এই পদক্ষেপটি এড়িয়ে যান। অন্যথায়, একটি অভ্যন্তরীণ কমান্ড বিশ্লেষণ এবং কার্যকর করার চেষ্টা করুন।
    • নিম্নলিখিত প্রশ্নাগুলি নির্ধারণ করা হয়েছে যে কোনও উত্তরহীন কমান্ড টোকেন একটি অভ্যন্তরীণ কমান্ড উপস্থাপন করে:
      • যদি কমান্ড টোকেনটি অভ্যন্তরীণ কমান্ডের সাথে সঠিকভাবে মেলে, তবে এটি কার্যকর করুন।
      • অন্যথায় প্রথম উপস্থিতির আগে কমান্ড টোকনটি ভাঙ্গুন + / [ ] <space> <tab> , ;বা =
        পূর্ববর্তী পাঠ্যটি যদি অভ্যন্তরীণ আদেশ হয় তবে সেই আদেশটি মনে রাখবেন
        • যদি কমান্ড লাইন মোডে থাকে, বা যদি কমান্ডটি প্রথম বন্ধনীযুক্ত ব্লক থেকে থাকে, যদি সত্য বা মিথ্যা কমান্ড ব্লক, ডু কমান্ড ব্লকের জন্য বা কমান্ড কনটেনটেশনের সাথে জড়িত থাকে, তবে অভ্যন্তরীণ কমান্ডটি কার্যকর করুন
        • অন্যটি (ব্যাচ মোডে অবশ্যই একা একা কমান্ড হতে হবে) বর্তমান ফোল্ডারটি স্ক্যান করে .COM, .EXE, .BAT, বা .CMD ফাইলের জন্য যার মূল নামটি মূল কমান্ড টোকেনের সাথে মেলে
          • যদি প্রথম মিলের ফাইলটি একটি .BAT বা .CMD হয়, তবে 7.3.exec এ যান এবং সেই স্ক্রিপ্টটি কার্যকর করুন
          • অন্য (ম্যাচটি পাওয়া যায় নি বা প্রথম ম্যাচটি হয়। EXE বা .COM) মনে রাখা অভ্যন্তরীণ কমান্ড কার্যকর করে
      • অন্যথায় প্রথম উপস্থিতির আগে কমান্ড টোকনটি ভাঙ্গুন . \বা :
        পূর্ববর্তী পাঠ্যটি কোনও অভ্যন্তরীণ কমান্ড না হলে 7.২
        পূর্ববর্তী পাঠ্যটি অভ্যন্তরীণ কমান্ড হতে পারে। এই আদেশ মনে রাখবেন।
      • প্রথম উপস্থিতির আগে কমান্ড টোকনটি ভাঙ্গুন + / [ ] <space> <tab> , ;বা =
        পূর্ববর্তী পাঠ্যটি যদি কোনও বিদ্যমান ফাইলে যাওয়ার পথ হয় তবে যান 7.2
        অন্যথায় স্মরণযোগ্য অভ্যন্তরীণ কমান্ড কার্যকর করুন।
    • যদি অভ্যন্তরীণ কমান্ডটি বৃহত্তর কমান্ড টোকেন থেকে পার্স করা হয়, তবে কমান্ড টোকেনের অব্যবহৃত অংশটি আর্গুমেন্ট তালিকায় অন্তর্ভুক্ত করা হবে
    • কোনও কমান্ড টোকেনকে অভ্যন্তরীণ কমান্ড হিসাবে বিশ্লেষণ করার অর্থ এই নয় যে এটি সফলভাবে কার্যকর হবে। প্রতিটি আভ্যন্তরীণ কমান্ডের নিজস্ব নিয়ম রয়েছে কীভাবে আর্গুমেন্ট এবং বিকল্পগুলি পার্স করা হয় এবং কী সিনট্যাক্স অনুমোদিত allowed
    • সমস্ত অভ্যন্তরীণ কমান্ডগুলি /?সনাক্ত করা থাকলে তাদের ফাংশন সম্পাদনের পরিবর্তে সহায়তা মুদ্রণ করবে । /?এটি আর্গুমেন্টের যে কোনও জায়গায় উপস্থিত থাকলে বেশিরভাগকে সনাক্ত করুন । তবে ECHO এবং SET এর মতো কয়েকটি কমান্ড কেবল প্রথম মুদ্রণ টোকেন শুরু হলে মুদ্রণ সহায়তা করে /?
    • SET এর কিছু আকর্ষণীয় শব্দার্থক শব্দ রয়েছে:
      • ভেরিয়েবলের নাম এবং এক্সটেনশানগুলি সক্ষম করার আগে যদি কোনও এসইটি কমান্ডের একটি উদ্ধৃতি থাকে
        set "name=content" ignored -> মান = content
        তবে প্রথম সমান চিহ্ন এবং শেষ উদ্ধৃতিটির মধ্যবর্তী পাঠ্যটি সামগ্রী হিসাবে ব্যবহৃত হবে (প্রথম সমান এবং শেষ উদ্ধৃতি বাদ দেওয়া হয়েছে)। শেষ উদ্ধৃতিটির পরে পাঠ্য উপেক্ষা করা হবে। যদি সমান চিহ্নের পরে কোনও উদ্ধৃতি না থাকে, তবে বাকী রেখাটি সামগ্রী হিসাবে ব্যবহৃত হয়।
      • যদি কোনও এসইটি কমান্ডের নামের
        set name="content" not ignored -> মান = এর আগে একটি উদ্ধৃতি না থাকে "content" not ignored
        তবে সমান হওয়ার পরে লাইনের পুরো অবশিষ্টটি উপস্থিত এবং উপস্থিত সমস্ত উক্তি সমেত সামগ্রী হিসাবে ব্যবহৃত হবে।
    • যদি একটি আইএফ তুলনা মূল্যায়ন করা হয়, এবং শর্তটি সত্য বা মিথ্যা কিনা তার উপর নির্ভর করে উপযুক্ত ইতিমধ্যে পার্সড নির্ভরশীল কমান্ড ব্লকটি প্রক্রিয়া করা হয়, পর্ব 5 থেকে শুরু করে।
    • ফর কমান্ডের আইএন ক্লজটি যথাযথভাবে পুনরাবৃত্তি করা হয়।
      • যদি এটি কোনও ফর / এফ হয় যা কমান্ড ব্লকের আউটপুটকে পুনরাবৃত্তি করে, তবে:
        • আইএন ক্লজটি সিএমডি / সি এর মাধ্যমে একটি নতুন সেন্টিমিডি.এক্সই প্রক্রিয়ায় কার্যকর করা হয়।
        • কমান্ড ব্লকটি অবশ্যই দ্বিতীয়বার পুরো পার্সিং প্রক্রিয়াটির মধ্য দিয়ে যেতে হবে, তবে এবার একটি কমান্ড লাইনের প্রসঙ্গে
        • ECHO চালু হবে, এবং বিলম্বিত সম্প্রসারণটি সাধারণত অক্ষম হয়ে যায় (রেজিস্ট্রি সেটিংয়ের উপর নির্ভরশীল)
        • আইএন ক্লজ কমান্ড ব্লকের দ্বারা করা সমস্ত পরিবেশগত পরিবর্তনগুলি শিশু সিএমডি.এক্স.এক্স প্রক্রিয়াটি শেষ হয়ে গেলে হারিয়ে যাবে
      • প্রতিটি পুনরাবৃত্তির জন্য:
        • ফর ভেরিয়েবলের মানগুলি সংজ্ঞায়িত করা হয়
        • ইতিমধ্যে পার্স করা ডিও কমান্ড ব্লকটি প্রক্রিয়া করা হবে, ফেজ 4 দিয়ে শুরু হবে।
    • গোটো: লেবেল সনাক্ত করতে নিম্নলিখিত যুক্তি ব্যবহার করে
      • লেবেলটি প্রথম আর্গুমেন্ট টোকেন থেকে পার্স করা হয়েছে
      • স্ক্রিপ্টটি লেবেলের পরবর্তী ঘটনার জন্য স্ক্যান করা হয়েছে
        • বর্তমান ফাইল অবস্থান থেকে স্ক্যান শুরু হয়
        • যদি ফাইলের শেষের দিকে পৌঁছে যায়, তবে স্ক্যানটি ফাইলের শুরুতে ফিরে আসে এবং মূল শুরুর পয়েন্টে অবিরত থাকে।
      • স্ক্যানটি লেবেলের যে সন্ধান পায় এটির প্রথম উপস্থিতিতে থামিয়ে দেয় এবং ফাইল পয়েন্টারটি লেবেলের সাথে সাথেই লাইনে সেট করা থাকে। স্ক্রিপ্টটির কার্য সম্পাদন সেই বিন্দু থেকে পুনরায় শুরু হয়। মনে রাখবেন যে একটি সফল সত্য GOTO অবিলম্বে ফর লুপগুলি সহ কোনও পার্সড ব্লক কোড বাতিল করে দেবে।
      • যদি লেবেলটি পাওয়া যায় না, বা লেবেল টোকেনটি অনুপস্থিত থাকে তবে GOTO ব্যর্থ হয়, একটি ত্রুটি বার্তা মুদ্রিত হয় এবং কল স্ট্যাকটি পপ হয়। এটি কার্যকরভাবে একটি এক্সআইটিটি / বি হিসাবে কার্যকর করে, বর্তমান কমান্ড ব্লকের যে কোনও পার্সড কমান্ডগুলি ছাড়াও জিওটিও অনুসরণ করে এখনও কার্যকর করা হয়, তবে CALLer এর প্রসঙ্গে (প্রসঙ্গ যা প্রসারিত হয় / প্রস্থানের পরে বিদ্যমান)
      • লেবেল বিশ্লেষণের জন্য ব্যবহৃত বিধিগুলির আরও সুনির্দিষ্ট বিবরণের জন্য https://www.dostips.com/forum/viewtopic.php?f=3&t=3803 দেখুন ।
    • পুনরায় নামকরণ এবং কপি উভয় উত্স এবং টার্গেট পাথের জন্য ওয়াইল্ডকার্ড গ্রহণ করে। মাইক্রোসফ্ট বিশেষত টার্গেট পাথের জন্য কীভাবে ওয়াইল্ডকার্ডগুলি কাজ করে তার ডকুমেন্টিং একটি ভয়ানক কাজ করে। উইন্ডোকার্ড নিয়মের একটি কার্যকর সেট পাওয়া যেতে পারে উইন্ডোজ রেইম কমান্ড কীভাবে ওয়াইল্ডকার্ডকে ব্যাখ্যা করে?
  • .2.২ - ভলিউম পরিবর্তন সম্পাদন করুন - অন্যথায় যদি কমান্ড টোকেনটি উদ্ধৃতি দিয়ে শুরু না হয়, ঠিক দুটি অক্ষর দীর্ঘ হয়, এবং ২ য় অক্ষরটি একটি কোলন হয়, তবে ভলিউম পরিবর্তন করুন
    • সমস্ত আর্গুমেন্ট টোকেন উপেক্ষা করা হয়
    • প্রথম অক্ষর দ্বারা নির্দিষ্ট ভলিউম যদি খুঁজে পাওয়া যায় না, তবে একটি ত্রুটি সহ বাতিল করুন
    • একটি কমান্ড টোকেন ::সর্বদা ত্রুটির ফলশ্রুতি দেয় যতক্ষণ না এসইউবিএসটি একটি ভলিউম সংজ্ঞায়িত করতে ব্যবহৃত হয় ::
      যদি SUBST এর জন্য একটি ভলিউম সংজ্ঞায়িত করতে ব্যবহৃত হয় ::, তবে ভলিউমটি পরিবর্তন করা হবে, এটি একটি লেবেল হিসাবে বিবেচনা করা হবে না।
  • 7.3 - বহিরাগত কমান্ড কার্যকর করুন - অন্যথায় আদেশটি বহিরাগত কমান্ড হিসাবে বিবেচনা করার চেষ্টা করুন।
    • কমান্ড লাইন মোড এবং কমান্ড উদ্ধৃত করা না থাকলে এবং একটি ভলিউম স্পেসিফিকেশন, সাদা-স্পেস দিয়ে শুরু নয়, ,, ;, =বা +তারপর কমান্ডের প্রথম সংঘটন এ টোকেনটি বিরতি <space> , ;বা =এবং টোকেন (গুলি) যুক্তি বাকি পূর্বে লিখুন।
    • কমান্ড টোকেনের 2 য় অক্ষরটি যদি কোলন হয় তবে 1 ম অক্ষর দ্বারা নির্দিষ্ট ভলিউমটি যাচাই করা যেতে পারে।
      যদি ভলিউমটি পাওয়া যায় না, তবে একটি ত্রুটি সহ বাতিল করুন।
    • যদি ব্যাচ মোডে থাকে এবং কমান্ড টোকেনটি শুরু হয় :, তবে যান 7.৪
      দ্রষ্টব্য যে লেবেল টোকেনটি যদি শুরু হয় ::, তবে এটি পৌঁছানো যাবে না কারণ পূর্ববর্তী পদক্ষেপটি ত্রুটির সাথে বাতিল হয়ে থাকবে যদি না SUBST এর জন্য একটি ভলিউম সংজ্ঞায়িত করতে ব্যবহৃত হয় ::
    • এক্সিকিউট করতে বাহ্যিক কমান্ড শনাক্ত করুন।
      • এটি একটি জটিল প্রক্রিয়া যা বর্তমান ভলিউম, বর্তমান ডিরেক্টরি, PATH ভেরিয়েবল, পাঠ্য ভেরিয়েবল এবং ফাইল অ্যাসোসিয়েশন জড়িত থাকতে পারে।
      • যদি কোনও বৈধ বহিরাগত কমান্ড সনাক্ত করা যায় না, তবে ত্রুটি সহ বাতিল করুন।
    • যদি কমান্ড লাইন মোডে থাকে এবং কমান্ড টোকেনটি দিয়ে শুরু হয় :, তবে যান 7.4
      নোট করুন যে এটি কদাচিৎ পৌঁছেছে কারণ পূর্ববর্তী পদক্ষেপটি ত্রুটি দ্বারা বাতিল হয়ে যাবে যদি না কমান্ড টোকেন শুরু হয় ::, এবং SUBST এর জন্য একটি ভলিউম সংজ্ঞায়িত করতে ব্যবহৃত হয় ::, এবং সম্পূর্ণ কমান্ড টোকেন একটি বাহ্যিক কমান্ডের একটি বৈধ পথ।
    • 7.3.exec - বাহ্যিক কমান্ড কার্যকর করুন।
  • 7.4 - একটি লেবেল উপেক্ষা করুন - কমান্ড টোকেন শুরু হলে কমান্ড এবং এর সমস্ত যুক্তি উপেক্ষা করুন :
    .2.২ এবং .3.৩ এর বিধিগুলি এই লেবেলে পৌঁছতে বাধা দিতে পারে prevent

কমান্ড লাইন পার্সার:

ব্যাচলাইন-পার্সারের মতো কাজ করে, বাদে:

পর্ব 1) শতাংশ সম্প্রসারণ:

  • না %*, %1ইত্যাদি যুক্তি প্রসার
  • যদি ভার %var%অপরিবর্তিত থাকে তবে অপরিবর্তিত রয়েছে।
  • কোন বিশেষ পরিচালনা %%। যদি var = সামগ্রী থাকে তবে %%var%%প্রসারিত হয় %content%

পর্ব 3) পার্সড কমান্ড (গুলি) প্রতিধ্বনি করুন

  • এটি দ্বিতীয় ধাপ 2 পরে সম্পাদন করা হয় না এটি কেবল ডিও কমান্ড ব্লকের জন্য ফেজ 4 পরে করা হয়।

পর্ব 5) বিলম্বিত সম্প্রসারণ: কেবলমাত্র যদি বিলম্বপ্রাপ্তি সক্ষম হয়

  • যদি ভার !var!অপরিবর্তিত থাকে তবে অপরিবর্তিত রয়েছে।

পর্ব 7) আদেশ কার্যকর করুন

  • কল বা GOTO এ করার চেষ্টা করুন: লেবেলের ফলে একটি ত্রুটি হয়।
  • ইতিমধ্যে 7 ম পর্বে নথিভুক্ত হিসাবে, একটি মৃত্যুদন্ড কার্যকর লেবেল বিভিন্ন পরিস্থিতিতে একটি ত্রুটি হতে পারে।
    • ব্যাচ এক্সিকিউটড লেবেলগুলি কেবল যদি শুরু হয় তবে ত্রুটি ঘটায় cause ::
    • কমান্ড লাইন প্রায়শই চালিত লেবেলগুলির ফলে প্রায়শই একটি ত্রুটি হয়

পূর্ণসংখ্যার মানগুলির পার্সিং

অনেকগুলি ভিন্ন প্রসঙ্গ রয়েছে যেখানে সেন্টিমিডি.এক্সে স্ট্রিং থেকে পূর্ণসংখ্যার মানগুলি পার্স করে এবং নিয়মগুলি অসঙ্গত:

  • SET /A
  • IF
  • %var:~n,m% (পরিবর্তনশীল সাবস্তর বিস্তৃতি)
  • FOR /F "TOKENS=n"
  • FOR /F "SKIP=n"
  • FOR /L %%A in (n1 n2 n3)
  • EXIT [/B] n

কীভাবে সিএমডি.এক্স.ই.এস. সংখ্যাকে পার্স করে তার বিধিগুলির বিবরণগুলি বিধিগুলিতে পাওয়া যেতে পারে


যে কেউ cmd.exe পার্সিং বিধি উন্নত করতে ইচ্ছুক তাদের জন্য ডসটিপস ফোরামে একটি আলোচনার বিষয় রয়েছে যেখানে সমস্যাগুলি প্রতিবেদন করা যেতে পারে এবং পরামর্শ দেওয়া যেতে পারে।

আশা করি এটি
জেন এরিক (জেব) কে সহায়তা করেছে - মূল লেখক এবং পর্যায়ক্রমে
ডেভ বেনহাম (ডিবেনহাম) - এর অতিরিক্ত অতিরিক্ত সামগ্রী এবং সম্পাদনা


4
হ্যালো জেব, আপনার অন্তর্দৃষ্টি জন্য আপনাকে ধন্যবাদ ... এটি বুঝতে অসুবিধা হতে পারে, কিন্তু আমি এটি মাধ্যমে চিন্তা করার চেষ্টা করব! আপনি অনেক পরীক্ষা করেছেন বলে মনে হচ্ছে! অনুবাদ করার জন্য আপনাকে ধন্যবাদ ( অ্যাডমিনিস্ট্রেটর.ডি /… )
বেনোইট

2
ব্যাচ ফেজ 5) - %% একটি ইতিমধ্যে পর্ব 1 এ% এ পরিবর্তিত হয়েছে, সুতরাং লুপের প্রসারণটি সত্যিই% a প্রসারিত করে। এছাড়াও, আমি নীচের উত্তরে ব্যাচের প্রথম ধাপ 1 এর আরও বিশদ ব্যাখ্যা যুক্ত করেছি (আমার কাছে বিশেষাধিকারের সম্পাদনা নেই)
dbenham

3
জেব - সম্ভবত ফেজ 0 টি সরানো এবং ফেজ 6 এর সাথে মিলিত হতে পারে? এটি আমার কাছে আরও বোধগম্য হয় বা তারা এমনভাবে আলাদা হওয়ার কারণ আছে?
dbenham

1
@ এসচিপএফএল - আমি এই বিভাগটি আপডেট করেছি। )সত্যিই প্রায় এক মত ফাংশন আছে REMযখন প্রথম বন্ধনী কাউন্টার 0. উভয় কম্যান্ড লাইন থেকে এগুলোর চেষ্টা কমান্ড প্রয়োগ করুন: ) Ignore thisএবংecho OK & ) Ignore this
dbenham

1
@ এসচিপএফএল হ্যাঁ এটি সঠিক, অতএব আপনি কখনও কখনও 'সেট "var =% এক্সপ্রেস%" দেখতে পাবেন! 'শেষ বিস্ময়বোধক চিহ্ন সরানো হবে তবে বাহিনী ফেজ 5
Jeb

62

কমান্ড উইন্ডো থেকে একটি আদেশ সঞ্চার করার সময়, কমান্ড লাইন আর্গুমেন্টের টোকেনাইজেশন cmd.exe(ওরফে "শেল") দ্বারা করা হয় না । বেশিরভাগ ক্ষেত্রে tokenization নবগঠিত প্রসেস 'সি / সি ++ রানটাইম দ্বারা সম্পন্ন করা হয়, কিন্তু এই না অগত্যা তাই হয় - যদি নতুন পদ্ধতির সি / সি নেই লেখা হয়েছিল, উদাহরণস্বরূপ ++ বা নতুন প্রক্রিয়া তা চয়ন উপেক্ষা করার যদি argvএবং প্রক্রিয়া নিজের জন্য কাঁচা কমান্ডলাইন ( যেমন গেটকম্যান্ডলাইন সহ ))। ওএস স্তরে, উইন্ডোজ নতুন প্রক্রিয়াগুলিতে একক স্ট্রিং হিসাবে অলঙ্কিত কমান্ড লাইনগুলি পাস করে। এটি বেশিরভাগ * নিক্স শাঁসের বিপরীতে, যেখানে শেলটি নতুন গঠিত প্রক্রিয়াতে প্রেরণ করার আগে একটি সুসংগত, অনুমানযোগ্য উপায়ে যুক্তিকে টোকনাইজ করে। এর সমস্ত অর্থ হ'ল আপনি উইন্ডোজের বিভিন্ন প্রোগ্রাম জুড়ে বন্যভাবে বিচ্ছিন্ন যুক্তি টোকনাইজেশন আচরণ অনুভব করতে পারেন, কারণ পৃথক প্রোগ্রামগুলি প্রায়শই তাদের নিজের হাতে যুক্তি টোকেনাইজেশন নেয়।

যদি তা অরাজকতার মতো মনে হয় তবে তা একরকম। যাইহোক, উইন্ডোস প্রোগ্রাম সংখ্যক যেহেতু না মাইক্রোসফট সি / সি ++ রানটাইম এর ব্যবহার argv, এটা বোঝা সাধারণত দরকারী হতে পারে কিভাবে MSVCRT tokenizes আর্গুমেন্ট। এখানে একটি অংশ:

  • যুক্তিগুলি সাদা স্থান দ্বারা সীমিত করা হয়, যা হয় কোনও স্থান বা কোনও ট্যাব।
  • ডাবল উদ্ধৃতি চিহ্ন দ্বারা পরিবেষ্টিত একটি স্ট্রিং এর ভিতরে থাকা সাদা স্থান নির্বিশেষে একক যুক্তি হিসাবে ব্যাখ্যা করা হয়। একটি উদ্ধৃত স্ট্রিংটি একটি আর্গুমেন্টে এম্বেড করা যেতে পারে। নোট করুন যে ক্যারেট (^) একটি পালানোর চরিত্র বা ডিলিমিটার হিসাবে স্বীকৃত নয়।
  • ব্যাকস্ল্যাশ এর আগে একটি ডাবল উদ্ধৃতি চিহ্ন, \ ", আক্ষরিক ডাবল উদ্ধৃতি চিহ্ন (") হিসাবে ব্যাখ্যা করা হয়।
  • ব্যাকস্ল্যাশগুলি আক্ষরিক অর্থে ব্যাখ্যা করা হয়, যদি না তাৎক্ষণিকভাবে ডাবল উদ্ধৃতি চিহ্নের আগে উপস্থিত হয়।
  • যদি একটি এমনকি ব্যাকস্ল্যাশগুলির দ্বিগুণ উদ্ধৃতি চিহ্ন অনুসরণ করা হয়, তবে প্রতিটি ব্যাকস্ল্যাশ (\) এর জন্য একটি ব্যাকস্ল্যাশ () আরজিভি অ্যারেতে স্থাপন করা হয় এবং ডাবল উদ্ধৃতি চিহ্ন (") স্ট্রিং ডিলিমিটার হিসাবে ব্যাখ্যা করা হয়।
  • যদি একটি বিজোড় সংখ্যার ব্যাকস্ল্যাশকে দ্বিগুণ উদ্ধৃতি চিহ্ন অনুসরণ করা হয়, তবে প্রতিটি ব্যাকস্ল্যাশ (\) এর জন্য একটি ব্যাকস্ল্যাশ () আরগভি অ্যারেতে স্থাপন করা হয় এবং ডাবল উদ্ধৃতি চিহ্নটি অবশিষ্ট ব্যাকস্ল্যাশ দ্বারা একটি পালানোর ক্রম হিসাবে ব্যাখ্যা করা হয়, যার ফলে একটি আক্ষরিক ডাবল উদ্ধৃতি চিহ্ন (") আরজিভিতে রাখতে হবে।

মাইক্রোসফ্ট "ব্যাচ ল্যাঙ্গুয়েজ" ( .bat) এই নৈরাজ্যময় পরিবেশের ব্যতিক্রম নয় এবং এটি টোকেনাইজেশন এবং পালানোর জন্য নিজস্ব অনন্য নিয়ম তৈরি করেছে। এটি দেখতে দেখতে নতুন রূপায়নের প্রক্রিয়াতে যুক্তিটি পাস করার আগে cmd.exe এর কমান্ড প্রম্পট কমান্ড লাইন আর্গুমেন্টের (বেশিরভাগ পরিবর্তনশীল প্রতিস্থাপন এবং পলায়নের জন্য) কিছু প্রাকপ্রসেসিং করে। আপনি এই পৃষ্ঠায় জেবি এবং ডেনহ্যাম দ্বারা উত্তরের উত্তরে ব্যাচ ভাষার নিম্ন-স্তরের বিশদ এবং সেন্টিমিডি পলায়নের বিষয়ে আরও পড়তে পারেন।


আসুন সি তে একটি সাধারণ কমান্ড লাইন ইউটিলিটি তৈরি করি এবং এটি দেখুন আপনার পরীক্ষার কেসগুলি সম্পর্কে কী বলে:

int main(int argc, char* argv[]) {
    int i;
    for (i = 0; i < argc; i++) {
        printf("argv[%d][%s]\n", i, argv[i]);
    }
    return 0;
}

(দ্রষ্টব্য: আরজিভি [0] হ'ল সর্বদা কার্যকরযোগ্যের নাম এবং ব্রেভিটির জন্য নীচে বাদ দেওয়া হয় Windows উইন্ডোজ এক্সপি এসপি 3 তে পরীক্ষা করা হয়েছে Vis ভিজ্যুয়াল স্টুডিও 2005 এর সাথে সংকলিত))

> test.exe "a ""b"" c"
argv[1][a "b" c]

> test.exe """a b c"""
argv[1]["a b c"]

> test.exe "a"" b c
argv[1][a" b c]

এবং আমার নিজের কয়েকটি পরীক্ষা:

> test.exe a "b" c
argv[1][a]
argv[2][b]
argv[3][c]

> test.exe a "b c" "d e
argv[1][a]
argv[2][b c]
argv[3][d e]

> test.exe a \"b\" c
argv[1][a]
argv[2]["b"]
argv[3][c]

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। আপনার প্রোগ্রামটি কী ফলাফল আউটপুট দেয় তা টিনিপার্ল আউটপুট দেবে না তা আরও আরও ধাঁধা দেয় এবং কীভাবে পোস্ট-প্রসেসিং করা [a "b" c]যায় তা বুঝতে আমার অসুবিধা হয় [a "b] [c]
বেনোইট

এখন আমি এটি সম্পর্কে চিন্তা করি, কমান্ড লাইনের এই টোকনাইজেশন সম্ভবত পুরোপুরি সি রানটাইম দ্বারা সম্পন্ন হয়েছে। একটি এক্সিকিউটেবলকে এমন লেখা যেতে পারে যে এটি সি রানটাইম এমনকি ব্যবহার করে না, এই ক্ষেত্রে আমি মনে করি এটি কমান্ড লাইনের ভারব্যাটিমটি মোকাবেলা করতে হবে এবং তার নিজস্ব টোকেনাইজেশন করার জন্য দায়বদ্ধ হবে (যদি এটি চাইত।) অথবা এমনকি যদি আপনার অ্যাপ্লিকেশনটি সি রানটাইম ব্যবহার করে, আপনি আরগসি এবং আরজিভি উপেক্ষা করতে এবং উদাহরণস্বরূপ উইন 32 এর মাধ্যমে কাঁচা কমান্ড লাইন পেতে পছন্দ করতে পারেন GetCommandLine। সম্ভবত টিনিপার্ল আরগভি উপেক্ষা করছে এবং কেবল নিজস্ব নিয়ম দ্বারা কাঁচা কমান্ড লাইনকে টোকানাইজ করছে।
মাইক ক্লার্ক

4
"মনে রাখবেন উইন 32 এর দৃষ্টিকোণ থেকে, কমান্ড লাইনটি কেবল একটি স্ট্রিং যা নতুন প্রক্রিয়ার ঠিকানার জায়গায় অনুলিপি করা হয় the প্রবর্তন প্রক্রিয়া এবং নতুন প্রক্রিয়া এই স্ট্রিংটিকে কীভাবে ব্যাখ্যা করে তা নিয়ম দ্বারা নয় বরং কনভেনশন দ্বারা পরিচালিত হয়।" -রেমন্ড চেন ব্লগস.এমএসডন.কম
মাইক ক্লার্ক

2
সত্যিই চমৎকার উত্তরের জন্য আপনাকে ধন্যবাদ। এটি আমার মতে অনেক ব্যাখ্যা করে। এবং এটিও ব্যাখ্যা করে যে আমি কেন কখনও কখনও উইন্ডোজের সাথে কাজ করতে সত্যই কৃপণতা পাই ...
বেনোইট

আমি দেখেছি এই Win32 সি ++ প্রোগ্রামের জন্য, কমান্ড লাইন থেকেও argv হয় এর রূপান্তর সময় সংক্রান্ত ব্যাকস্ল্যাশ এবং কোট। ব্যাকস্ল্যাশ গণনাটি কেবল তখন দুটি দ্বারা বিভক্ত হয় যখন শেষ ব্যাকস্ল্যাশ একটি dblquote দ্বারা অনুসরণ করা হয়, এবং যখন আগে এমনকি একটি বহু সংখ্যক ব্যাকস্ল্যাশ থাকে তখন dblquote একটি স্ট্রিং বন্ধ করে দেয়।
বেনোইট

47

শতাংশ সম্প্রসারণ বিধি

এখানে জেবের উত্তরে প্রথম পর্যায়ের বিস্তৃত ব্যাখ্যা (ব্যাচ মোড এবং কমান্ড লাইন মোড উভয়ের জন্য বৈধ) id

পর্ব 1) শতকরা প্রসারিত বাম থেকে শুরু করে, প্রতিটি অক্ষর %বা এর জন্য স্ক্যান করুন <LF>। যদি পাওয়া যায় তবে

  • 1.05 (এটাকে কাটা লাইন <LF>)
    • তাহলে চরিত্র <LF>তারপর
      • <LF>পরের দিক থেকে লাইনের অবশিষ্ট অংশটি ড্রপ (উপেক্ষা) করুন
      • গোটো ফেজ 1.5 (স্ট্রিপ <CR>)
    • অন্য চরিত্রটি অবশ্যই হওয়া উচিত %, সুতরাং 1.1 এ এগিয়ে যান
  • % কমান্ড লাইন মোডে 1.1 (পলায়ন ) এড়ানো হয়েছে
    • যদি ব্যাচ মোড এবং অন্য কোনও অনুসরণ করে %তবে একক দিয়ে
      প্রতিস্থাপন করুন এবং স্ক্যান চালিয়ে যান%%%
  • 1.2 ( কমান্ড লাইন মোডে আর্গুমেন্ট প্রসারিত) এড়িয়ে গেছে
    • অন্যথায় যদি ব্যাচ মোড হয়
      • তাহলে দ্বারা অনুসরণ *এবং কমান্ড এক্সটেনশনগুলি সক্ষম হয়
        প্রতিস্থাপন %*সব কমান্ড লাইন আর্গুমেন্ট পাঠ্য সহ (কিছুই দিয়ে প্রতিস্থাপন করুন যদি কোন আর্গুমেন্ট) এবং স্ক্যান অবিরত।
      • অন্যথায় যদি দ্বারা অনুসরণ <digit>তারপর
        প্রতিস্থাপন %<digit>যুক্তি মান (কিছুই প্রতিস্থাপন যদি অনির্দিষ্ট) এবং স্ক্যান অবিরত।
      • অন্যথায় যদি অনুসরণ করা হয় ~এবং কমান্ড এক্সটেনশনগুলি সক্ষম হয়
        • যদি যুক্তি সংশোধনকারীদের ঐচ্ছিক বৈধ তালিকা প্রয়োজনীয় অনুসৃত দ্বারা অনুসরণ <digit>তারপর
          প্রতিস্থাপন %~[modifiers]<digit>পরিবর্তিত যুক্তি মান (কিছুই প্রতিস্থাপন যদি সংজ্ঞায়িত করা অথবা যদি $ PATH- নিদিষ্ট: পরিবর্তক সংজ্ঞায়িত করা হয় না) এবং স্ক্যান অবিরত।
          দ্রষ্টব্য: সংশোধনকারীগুলি সংবেদনশীল না হয় এবং order PATH ব্যতীত যে কোনও ক্রমে একাধিকবার উপস্থিত হতে পারে: পরিবর্তক কেবল একবার উপস্থিত হতে পারে এবং অবশ্যই তার আগে শেষ পরিবর্তনকারী হতে হবে<digit>
        • অন্য কোনও অবৈধ সংশোধিত যুক্তি সিনট্যাক্স মারাত্মক ত্রুটি উত্থাপন করে : সমস্ত পার্সড কমান্ড বাতিল করা হয়, এবং ব্যাচ মোডে থাকলে ব্যাচ প্রসেসিং বাতিল হয়!
  • 1.3 (পরিবর্তনশীল প্রসারিত)
    • অন্যথায় যদি কমান্ড এক্সটেনশনগুলি অক্ষম থাকে তবে
      অক্ষরের পরবর্তী স্ট্রিংটি দেখুন, %বাফারের আগে বা শেষে ভাঙ্গুন এবং তাদের ভিএআর (একটি খালি তালিকা হতে পারে) কল করুন
      • তাহলে পরবর্তী চরিত্র %তারপর
        • যদি ভিএআর সংজ্ঞায়িত করা হয় তবে ভিএআর এর মান দিয়ে
          প্রতিস্থাপন করুন %VAR%এবং স্ক্যান চালিয়ে যান
        • অন্যথায় যদি ব্যাচ মোড থাকে তবে
          সরান %VAR%এবং স্ক্যান চালিয়ে যান
        • অন্য Goo 1.4
      • অন্য Goo 1.4
    • অন্যথায় যদি কমান্ড এক্সটেনশানগুলি সক্ষম করা থাকে তবে বাফারের
      আগে % :বা শেষ ভেঙে অক্ষরের পরবর্তী স্ট্রিংটি দেখুন এবং তাদের ভিএআর (একটি খালি তালিকা হতে পারে) কল করুন। যদি ভিএআর আগে ভেঙে যায় :এবং পরবর্তী চরিত্রটি %তখন :ভিএআর-এর শেষ চরিত্র হিসাবে অন্তর্ভুক্ত হয় এবং আগে বিরতি হয় %
      • তাহলে পরবর্তী চরিত্র %তারপর
        • যদি ভিএআর সংজ্ঞায়িত করা হয় তবে ভিএআর এর মান দিয়ে
          প্রতিস্থাপন করুন %VAR%এবং স্ক্যান চালিয়ে যান
        • অন্যথায় যদি ব্যাচ মোড থাকে তবে
          সরান %VAR%এবং স্ক্যান চালিয়ে যান
        • অন্য Goo 1.4
      • অন্যথায় যদি পরবর্তী চরিত্র :তারপর
        • ভিএআর যদি অপরিবর্তিত থাকে তবে
          • যদি ব্যাচ মোড থাকে তবে
            সরান %VAR:এবং স্ক্যান চালিয়ে যান।
          • অন্য Goo 1.4
        • অন্যথায় যদি পরবর্তী চরিত্র ~তারপর
          • যদি অক্ষরের পরবর্তী স্ট্রিং এর প্যাটার্নের সাথে মেলে [integer][,[integer]]%তবে ভিএআর মান (সম্ভবত খালি স্ট্রিংয়ের ফলে) এর স্ট্রিং দিয়ে
            প্রতিস্থাপন করুন %VAR:~[integer][,[integer]]%এবং স্ক্যান চালিয়ে যান।
          • অন্য Goo 1.4
        • অন্যথায় যদি অনুসরণ করা হয় =বা *=তারপরে
          অবৈধ পরিবর্তনীয় অনুসন্ধান এবং সিনট্যাক্স প্রতিস্থাপন মারাত্মক ত্রুটি উত্থাপন করে : সমস্ত পার্সড কমান্ড বাতিল করা হয়েছে, এবং ব্যাচ মোডে থাকলে ব্যাচ প্রসেসিং অ্যাবੋਰਟস!
        • অক্ষরের পরবর্তী স্ট্রিং এর ধরণের সাথে মেলা অন্যথায় যদি [*]search=[replace]%, যেখানে অনুসন্ধান ব্যতীত অক্ষরের যে কোনও অন্তর্ভুক্ত হতে পারে =, এবং প্রতিস্থাপন ছাড়া অক্ষরের যে কোনও অন্তর্ভুক্ত হতে পারে %, তারপর
          প্রতিস্থাপন %VAR:[*]search=[replace]%(সম্ভবত খালি স্ট্রিং ফলে) অনুসন্ধান সম্পাদন পর VAR মান এবং প্রতিস্থাপন এবং অবিরত স্ক্যান
        • অন্য Goo 1.4
  • 1.4 (স্ট্রিপ%)
    • অন্যথায় যদি ব্যাচ মোড থাকে তবে
      অপসারণ করুন %এবং পরবর্তী অক্ষরের সাথে স্ক্যান শুরু করে চালিয়ে যান%
    • অন্যথায় অগ্রণী সংরক্ষণ করুন %এবং সংরক্ষণ করা শীর্ষস্থানীয় পরবর্তী অক্ষর দিয়ে শুরু স্ক্যান চালিয়ে যান%

উপরোক্ত কারণগুলি এই ব্যাচটি ব্যাখ্যা করতে সহায়তা করে

@echo off
setlocal enableDelayedExpansion
set "1var=varA"
set "~f1var=varB"
call :test "arg1"
exit /b  
::
:test "arg1"
echo %%1var%% = %1var%
echo ^^^!1var^^^! = !1var!
echo --------
echo %%~f1var%% = %~f1var%
echo ^^^!~f1var^^^! = !~f1var!
exit /b

এই ফলাফল দেয়:

%1var% = "arg1"var
!1var! = varA
--------
%~f1var% = P:\arg1var
!~f1var! = varB

নোট 1 - প্রথম পর্যায়টি REM বিবৃতিগুলির স্বীকৃতি পাওয়ার আগে ঘটে। এটি অত্যন্ত গুরুত্বপূর্ণ কারণ এর অর্থ এটি যদি একটি অবৈধ যুক্তি প্রসারণ সিনট্যাক্স বা অবৈধ ভেরিয়েবল অনুসন্ধান এবং সিনট্যাক্স প্রতিস্থাপন করে তবে একটি মন্তব্যও মারাত্মক ত্রুটি তৈরি করতে পারে!

@echo off
rem %~x This generates a fatal argument expansion error
echo this line is never reached

দ্রষ্টব্য 2 -% পার্সিং বিধিগুলির আরও একটি আকর্ষণীয় পরিণতি: নামেরে ভেরিয়েবলগুলি সংজ্ঞায়িত করা যেতে পারে তবে কমান্ড এক্সটেনশান অক্ষম না করা থাকলে এগুলি প্রসারিত করা যায় না। একটি ব্যতিক্রম রয়েছে - কমান্ড এক্সটেনশান সক্ষম থাকা অবস্থায় প্রান্তে একক কোলনযুক্ত একটি ভেরিয়েবল নাম প্রসারিত হতে পারে। তবে, আপনি কোলনের সাথে শেষ হওয়া চলক নামেরগুলিতে অপারেশন বা অনুসন্ধান এবং প্রতিস্থাপন করতে পারবেন না। নীচের ব্যাচ ফাইল (জিবের সৌজন্যে) এই আচরণটি দেখায়

@echo off
setlocal
set var=content
set var:=Special
set var::=double colon
set var:~0,2=tricky
set var::~0,2=unfortunate
echo %var%
echo %var:%
echo %var::%
echo %var:~0,2%
echo %var::~0,2%
echo Now with DisableExtensions
setlocal DisableExtensions
echo %var%
echo %var:%
echo %var::%
echo %var:~0,2%
echo %var::~0,2%

নোট 3 - পার্সিং বিধিগুলির ক্রমের একটি আকর্ষণীয় ফলাফল যা জেব তার পোস্টে দেয়: দেরী সম্প্রসারণের সাথে সন্ধান এবং প্রতিস্থাপনের সময়, অনুসন্ধান এবং প্রতিস্থাপন শর্তাদির উভয় বিশেষ অক্ষরকে পালাতে বা উদ্ধৃত করতে হবে। তবে শতাংশ শতাংশ বৃদ্ধির জন্য পরিস্থিতি আলাদা - সন্ধানের শব্দটি এড়ানোর দরকার নেই (যদিও এটি উদ্ধৃত করা যেতে পারে)। শতাংশ প্রতিস্থাপন স্ট্রিং আপনার অভিপ্রায় উপর নির্ভর করে পালাতে বা উদ্ধৃতি প্রয়োজন হতে পারে বা নাও পারে।

@echo off
setlocal enableDelayedExpansion
set "var=this & that"
echo %var:&=and%
echo "%var:&=and%"
echo !var:^&=and!
echo "!var:&=and!"

বিলম্বিত প্রসারণ বিধি

এখানে জেবের উত্তরের 5 তম বিস্তৃত এবং আরও সঠিক ব্যাখ্যা দেওয়া হয়েছে (ব্যাচ মোড এবং কমান্ড লাইন মোড উভয়ের জন্যই বৈধ)

পর্ব 5) বিলম্বিত প্রসারণ

নিম্নলিখিত অবস্থার যে কোনও একটি প্রয়োগ করলে এই পর্বটি এড়িয়ে যায়:

  • বিলম্বিত সম্প্রসারণ অক্ষম করা হয়েছে।
  • কমান্ডটি পাইপের উভয় পাশের বন্ধনীযুক্ত ব্লকের মধ্যে রয়েছে।
  • ইনকামিং কমান্ড টোকেনটি একটি "নগ্ন" ব্যাচের স্ক্রিপ্ট, যার অর্থ এটি CALLকোনও বন্ধুত্বের ব্লক, কোনও কমান্ড কনকেন্টেশন ( &, &&বা ||), বা পাইপের সাথে সম্পর্কিত নয় |

বিলম্বিত প্রসারণ প্রক্রিয়াটি টোকেনগুলিতে স্বাধীনভাবে প্রয়োগ করা হয়। একটি কমান্ডে একাধিক টোকেন থাকতে পারে:

  • কমান্ড টোকেন। বেশিরভাগ কমান্ডের জন্য কমান্ডের নাম নিজেই একটি টোকেন। তবে কয়েকটি কমান্ডের মধ্যে বিশেষায়িত অঞ্চল রয়েছে যা 5 ম পর্যায়ের জন্য টোকেন হিসাবে বিবেচিত হয়।
    • for ... in(TOKEN) do
    • if defined TOKEN
    • if exists TOKEN
    • if errorlevel TOKEN
    • if cmdextversion TOKEN
    • if TOKEN comparison TOKENসেখানে তুলনা অন্যতম ==, equ, neq, lss, leq, gtr, অথবাgeq
  • আর্গুমেন্ট টোকেন
  • পুনঃনির্দেশের গন্তব্য টোকেন (প্রতি পুনঃনির্দেশে এক)

নেই এমন টোকেনগুলিতে কোনও পরিবর্তন করা হয় না !

কমপক্ষে একটি ধারণ করে এমন প্রতিটি টোকেনের জন্য !, প্রতিটি অক্ষর বাম থেকে ডানে ^বা তার জন্য স্ক্যান করুন !এবং যদি পাওয়া যায় তবে

  • 5.1 (ক্যারেট পলায়ন) প্রয়োজন !বা ^আক্ষরিক জন্য
    • চরিত্রটি যদি ^তখন একটি কেরেট হয়
      • অপসারণ ^
      • পরবর্তী চরিত্রটি স্ক্যান করুন এবং এটি আক্ষরিক হিসাবে সংরক্ষণ করুন
      • স্ক্যান চালিয়ে যান
  • 5.2 (পরিবর্তনশীল প্রসারিত)
    • চরিত্র যদি হয় !, তবে
      • যদি কমান্ড এক্সটেনশানগুলি অক্ষম করা থাকে তবে এর
        আগে !বা ভেঙে অক্ষরের পরবর্তী স্ট্রিংটি দেখুন <LF>এবং তাদের ভিএআর করুন (খালি তালিকা হতে পারে)
        • তাহলে পরবর্তী চরিত্র !তারপর
          • যদি ভিএআর সংজ্ঞায়িত করা হয়, তবে ভিএআর এর মান দিয়ে
            প্রতিস্থাপন করুন !VAR!এবং স্ক্যান চালিয়ে যান
          • অন্যথায় যদি ব্যাচ মোড থাকে তবে
            সরান !VAR!এবং স্ক্যান চালিয়ে যান
          • অন্য গোটো 5.2.1
        • অন্য গোটো 5.2.1
      • অন্যথায় যদি কমান্ড এক্সটেনশন সক্রিয় করা থাকে তারপর
        , অক্ষরের পরের পংক্তি তাকান আগে ভঙ্গ !, :অথবা <LF>, এবং তাদের VAR কল (একটি খালি তালিকা হতে পারে)। যদি ভিএআর আগে ভেঙে যায় :এবং পরবর্তী চরিত্রটি !তখন :ভিএআর-এর শেষ চরিত্র হিসাবে অন্তর্ভুক্ত হয় এবং আগে বিরতি হয়!
        • তাহলে পরবর্তী চরিত্র !তারপর
          • যদি ভিএআর বিদ্যমান থাকে, তবে ভিএআর এর মান দিয়ে
            প্রতিস্থাপন করুন !VAR!এবং স্ক্যান চালিয়ে যান
          • অন্যথায় যদি ব্যাচ মোড থাকে তবে
            সরান !VAR!এবং স্ক্যান চালিয়ে যান
          • অন্য গোটো 5.2.1
        • অন্যথায় যদি পরবর্তী চরিত্র :তারপর
          • ভিএআর যদি অপরিবর্তিত থাকে তবে
            • যদি ব্যাচ মোড থাকে তবে
              সরান !VAR:এবং স্ক্যান চালিয়ে যান
            • অন্য গোটো 5.2.1
          • অন্যথায় যদি পরবর্তী চরিত্র ~তারপর
            • যদি অক্ষরের পরবর্তী স্ট্রিং এর প্যাটার্নের সাথে মেলে [integer][,[integer]]!তবে !VAR:~[integer][,[integer]]!ভিএআর মান (সম্ভবত খালি স্ট্রিংয়ের ফলে) এর স্ট্রিং দিয়ে প্রতিস্থাপন করুন এবং স্ক্যান চালিয়ে যান।
            • অন্য গোটো 5.2.1
          • অক্ষরের পরবর্তী স্ট্রিং এর ধরণের সাথে মেলা অন্যথায় যদি [*]search=[replace]!, যেখানে অনুসন্ধান ব্যতীত অক্ষরের যে কোনও অন্তর্ভুক্ত হতে পারে =, এবং প্রতিস্থাপন ছাড়া অক্ষরের যে কোনও অন্তর্ভুক্ত হতে পারে !, তারপর
            প্রতিস্থাপন !VAR:[*]search=[replace]!(সম্ভবত একটি খালি স্ট্রিং ফলে) অনুসন্ধান সম্পাদন পর VAR মান এবং প্রতিস্থাপন এবং স্ক্যান চালিয়ে যান
          • অন্য গোটো 5.2.1
        • অন্য গোটো 5.2.1
      • 5.2.1
        • যদি ব্যাচ মোডটি থাকে তবে শীর্ষস্থানীয় !
          অন্য সংরক্ষণের ক্ষেত্রে অপসারণ করুন!
        • সংরক্ষিত শীর্ষস্থানীয় হওয়ার পরে পরবর্তী অক্ষর দিয়ে শুরু হওয়া স্ক্যানটি চালিয়ে যান !

3
+1, %definedVar:a=b%বনাম %undefinedVar:a=b%এবং %var:~0x17,-010%ফর্মগুলির জন্য এখানে কেবল কোলন বাক্য গঠন এবং নিয়ম অনুপস্থিত রয়েছে
জেব

2
ভাল পয়েন্ট - আপনার উদ্বেগের সমাধানের জন্য আমি পরিবর্তনশীল সম্প্রসারণ বিভাগটি প্রসারিত করেছি। কিছু অনুপস্থিত বিশদ পূরণ করার জন্য আমি যুক্তি সম্প্রসারণ বিভাগটিও প্রসারিত করেছি।
dbenham

2
জেবের কাছ থেকে কিছু অতিরিক্ত বেসরকারী প্রতিক্রিয়া পাওয়ার পরে, আমি পরিবর্তনশীল নামের সাথে কোলনের সাথে শেষ হওয়ার জন্য একটি বিধি যুক্ত করেছি এবং 2 নোট যুক্ত করেছি I এছাড়াও আমি নোট 3 যুক্ত করেছি কেবল কারণ আমি ভেবেছিলাম এটি আকর্ষণীয় এবং গুরুত্বপূর্ণ।
dbenham

1
@ এসচিপএফএল - হ্যাঁ, আমি সে সম্পর্কে আরও বিশদে যাওয়ার বিষয়টি বিবেচনা করেছি, তবে খরগোশের গর্তটি নীচে যেতে চাইনি। আমি যখন [পূর্ণসংখ্যা] শব্দটি ব্যবহার করেছি তখন আমি ইচ্ছাকৃত অ-প্রতিশ্রুতিবদ্ধ ছিলাম CM সিএমডি.এক্সই সংখ্যাগুলি কীভাবে পার্স করে তার নিয়মগুলিতে আরও তথ্য রয়েছে ।
dbenham

1
আমি cmd কমান্ড প্রসঙ্গ জন্য সম্প্রসারণ নিয়ম অনুপস্থিত করছি, সেখানে মত পরিবর্তনশীল নামের প্রথম অক্ষর জন্য কোন সংরক্ষিত অক্ষর যে মত %<digit>, %*বা %~। এবং আচরণ অপরিবর্তিত ভেরিয়েবলের জন্য পরিবর্তন করে। সম্ভবত আপনার একটি দ্বিতীয় উত্তর খোলার দরকার আছে
jeb

7

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

সিস্টেম .batফাইলগুলি যতদূর যায়, এখানে সেই পরীক্ষাটি দেওয়া হয়:

c> type args.cmd
@echo off
echo cmdcmdline:[%cmdcmdline%]
echo 0:[%0]
echo *:[%*]
set allargs=%*
if not defined allargs goto :eof
setlocal
@rem Wot about a nice for loop?
@rem Then we are in the land of delayedexpansion, !n!, call, etc.
@rem Plays havoc with args like %t%, a"b etc. ugh!
set n=1
:loop
    echo %n%:[%1]
    set /a n+=1
    shift
    set param=%1
    if defined param goto :loop
endlocal

এখন আমরা কিছু পরীক্ষা চালাতে পারি। আপনি কী করতে চাইছেন তা সন্ধান করতে পারেন দেখুন: সফটওয়্যার কী চেষ্টা করছে:

C>args a b c
cmdcmdline:[cmd.exe ]
0:[args]
*:[a b c]
1:[a]
2:[b]
3:[c]

এখন পর্যন্ত দুর্দান্ত। (আমি নীরস আউট ছেড়ে দেব %cmdcmdline%এবং %0এখন থেকে।)

C>args *.*
*:[*.*]
1:[*.*]

কোনও ফাইলের নাম প্রসারিত হয়নি।

C>args "a b" c
*:["a b" c]
1:["a b"]
2:[c]

কোনও উদ্ধৃতি স্ট্রিপিং নেই, যদিও উদ্ধৃতিগুলি আর্গুমেন্ট বিভাজন রোধ করে।

c>args ""a b" c
*:[""a b" c]
1:[""a]
2:[b" c]

একটানা ডাবল কোটগুলির কারণে তাদের যে কোনও বিশেষ পার্সিং ক্ষমতা হারাতে পারে to @ বেনিয়টের উদাহরণ:

C>args "a """ b "" c"""
*:["a """ b "" c"""]
1:["a """]
2:[b]
3:[""]
4:[c"""]

কুইজ: আপনি কোনও পরিবেশের মানকে একটি একক আর্গুমেন্ট হিসাবে (যেমন, হিসাবে %1) কোনও ব্যাট ফাইলে কীভাবে দেন?

c>set t=a "b c
c>set t
t=a "b c
c>args %t%
1:[a]
2:["b c]
c>args "%t%"
1:["a "b]
2:[c"]
c>Aaaaaargh!

সানে পার্সিং চিরতরে ভাঙা মনে হচ্ছে।

আপনার বিনোদনের জন্য, বিবিধ যোগ করার চেষ্টা ^, \, ', &এই উদাহরণ করার জন্য (সি।) অক্ষর।


% T% কে একক আর্গুমেন্ট হিসাবে পাস করতে আপনি "% t:" = \ "%" ব্যবহার করতে পারেন, পরিবর্তনশীল প্রসারণের জন্য% VAR: str = প্রতিস্থাপন% সিনট্যাক্স ব্যবহার করুন। শেল মেটাচার্যাক্টর | এবং & ভেরিয়েবলের বিষয়বস্তুগুলিতে এখনও শেলটি ফাঁস হয়ে যেতে পারে এবং আপনি যদি আবার সেগুলি থেকে অব্যাহতি না পান তবে ....
কঠোর

@ শক্ত তাই, আমার উদাহরণে, tহয় a "b c। (আপনি ঐ 6 অক্ষর পাবার জন্য একটি উপায় আছে কি a, 2 × স্থান, ", b, এবং c) হিসাবে প্রদর্শিত %1একটি ভিতরে .cmd? আমি যদিও আপনার চিন্তা পছন্দ। args "%t:"=""%"বেশ কাছাকাছি :-)
বোবোগো

5

আপনার কাছে ইতিমধ্যে কিছু দুর্দান্ত উত্তর রয়েছে তবে আপনার প্রশ্নের একটি অংশের উত্তর দিতে:

set a =b, echo %a %b% c% → bb c%

সেখানে যা ঘটছে তা হ'ল = আপনার আগে একটি স্থান থাকার কারণে একটি ভেরিয়েবল তৈরি হয় %a<space>% যখন আপনাকে echo %a %সঠিকভাবে মূল্যায়ন করা হয় b

বাকী অংশটি b% c%তখন সরল পাঠ্য + একটি অপরিজ্ঞাত ভেরিয়েবল হিসাবে মূল্যায়ন করা হয় % c%, যা টাইপযুক্ত হিসাবে প্রতিধ্বনিত হওয়া উচিত, আমার জন্য echo %a %b% c%ফিরে আসেbb% c%

আমার সন্দেহ হয় যে পরিবর্তনশীল নামগুলিতে স্পেস অন্তর্ভুক্ত করার দক্ষতা একটি পরিকল্পিত 'বৈশিষ্ট্য' এর চেয়ে বেশি তদারকি করা


0

সম্পাদনা করুন: গৃহীত উত্তর দেখুন, যা অনুসরণ করা হয়েছে তা ভুল এবং কেবল কীভাবে একটি কমান্ড লাইন টিনিপার্লকে পাস করবেন তা ব্যাখ্যা করে।


উদ্ধৃতি সম্পর্কে, আমার মনে হয় যে আচরণটি নিম্নলিখিত:

  • যখন একটি "পাওয়া যায়, স্ট্রিং গ্লোব্বিং শুরু হয়
  • যখন স্ট্রিং গ্লোব্বিং ঘটে:
    • প্রতিটি চরিত্র যা একটি নয় "তা গ্লোববেড
    • যখন একটি "পাওয়া যায়:
      • যদি এটি অনুসরণ করা হয় ""(এভাবে ট্রিপল ") তবে স্ট্রিংয়ে একটি ডাবল উদ্ধৃতি যুক্ত করা হবে
      • যদি এটি অনুসরণ করা হয় "(এভাবে একটি ডাবল ") তারপরে একটি ডাবল উদ্ধৃতি যুক্ত করা হবে স্ট্রিং এবং স্ট্রিং গ্লোবাইং প্রান্তগুলিতে
      • পরবর্তী অক্ষরটি না "হলে স্ট্রিং গ্লোব্বিংয়ের সমাপ্তি ঘটে
    • যখন লাইন শেষ হয়, স্ট্রিং গ্লোব্বিং শেষ হয়।

সংক্ষেপে:

"a """ b "" c"""দুটি স্ট্রিং নিয়ে গঠিত: a " b "এবংc"

"a"", "a"""এবং "a""""লাইন শেষে যদি সমস্ত একই স্ট্রিং হয়


টোকেনাইজার এবং স্ট্রিং গ্লোব্বিং কমান্ডের উপর নির্ভর করে! একটি "সেট" আলাদাভাবে কাজ করে তারপরে একটি "কল" বা এমনকি "যদি"
জেব

হ্যাঁ, তবে বাহ্যিক আদেশগুলি কী? আমার ধারণা, সেমিডি.এক্সই সবসময় তাদের কাছে একই যুক্তি দিয়ে যায়?
বেনোইট

1
cmd.exe সর্বদা প্রসারণের ফলাফলটি একটি বাহ্যিক কমান্ডের টোকেন নয় স্ট্রিং হিসাবে পাস করে। এটি কীভাবে এড়াতে এবং টোকেনাইজ করতে হয় তা বাহ্যিক কমান্ডের উপর নির্ভর করে, ফাইন্ডস্ট্র ব্যাকস্ল্যাশ ব্যবহার করে পরেরটি অন্যরকম কিছু ব্যবহার করতে পারে
jeb

0

নোট করুন যে মাইক্রোসফ্ট তার টার্মিনালের উত্স কোড প্রকাশ করেছে। সিন্ট্যাক্স পার্সিংয়ের ক্ষেত্রে এটি কমান্ড লাইনের অনুরূপ কাজ করতে পারে। সম্ভবত কেউ টার্মিনালের পার্সিং নিয়ম অনুসারে বিপরীত ইঞ্জিনিয়ারড পার্সিং বিধি পরীক্ষা করতে আগ্রহী।

উত্স কোডে লিঙ্ক

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