পিটার মর্টেনসেনের উদ্ধৃত ২ য় নথিতে কোডস্মিথের উত্তরের বিষয়ে তার মন্তব্যে আমার কাছে বিষয়গুলি আরও পরিষ্কার করা হয়েছে। সেই দস্তাবেজটি উইন্ডোজিনস্পায়ারডটকম দ্বারা লিখেছিলেন। লিঙ্কটি পুনরাবৃত্তি: উইন্ডোজ কমান্ড লাইন আর্গুমেন্টের উদ্ধৃতি এবং প্রস্থান বোঝার একটি আরও ভাল উপায় ।
আরও কিছু বিচার এবং ত্রুটি নিম্নলিখিত নির্দেশিকাগুলির দিকে নিয়ে যায়:
"
একটি ক্যারেট দিয়ে প্রতিটি ডাবল উদ্ধৃতি এড়িয়ে চলুন ^
। আপনি Windows কমান্ড শেল বিশেষ অর্থ সঙ্গে অন্যান্য অক্ষরের চান (যেমন, <
, >
, |
, &
) নিয়মিত অক্ষর হিসেবে ব্যাখ্যা করা পরিবর্তে, তারপর একটি ক্যারেট সঙ্গে তাদের অব্যাহতি খুব।
আপনি যদি চান যে আপনার প্রোগ্রাম foo কমান্ড লাইনের পাঠ্যটি গ্রহণ করতে পারে "a\"b c" > d
এবং এর আউটপুটটি file.txt এ পুনর্নির্দেশ করতে পারে , তবে উইন্ডোজ কমান্ড শেল থেকে নিম্নলিখিত হিসাবে আপনার প্রোগ্রামটি শুরু করুন:
foo ^"a\^"b c^" ^> d > out.txt
Foo যদি \"
আক্ষরিক দ্বৈত উক্তি হিসাবে ব্যাখ্যা করে এবং অন্বেষিত দ্বৈত উদ্ধৃতিগুলি হোয়াইটস্পেস অন্তর্ভুক্ত অন্তর্ভুক্ত যুক্তিগুলি সীমিত করতে প্রত্যাশা করে, তবে foo একটি আর্গুমেন্ট a"b c
, একটি আর্গুমেন্ট >
এবং একটি যুক্তি নির্দিষ্ট করে কমান্ডটির ব্যাখ্যা করে d
।
পরিবর্তে যদি foo একটি দ্বিগুণ ডাবল উক্তিটিকে ""
আক্ষরিক দ্বৈত উদ্ধৃতি হিসাবে ব্যাখ্যা করে, তবে আপনার প্রোগ্রামটি শুরু করুন
foo ^"a^"^"b c^" ^> d > out.txt
উদ্ধৃত ডকুমেন্টের মূল অন্তর্দৃষ্টিটি হ'ল, উইন্ডোজ কমান্ড শেলের কাছে, একটি অপরিবর্তিত ডাবল উদ্ধৃতি দুটি সম্ভাব্য রাজ্যের মধ্যে স্যুইচিংকে ট্রিগার করে।
আরও কিছু ট্রায়াল এবং ত্রুটিটি সূচিত করে যে প্রাথমিক অবস্থায়, পুনঃনির্দেশ (একটি ফাইল বা পাইপের দিকে) স্বীকৃত হয় এবং একটি কেরেট ^
একটি ডাবল উদ্ধৃতি থেকে পালিয়ে যায় এবং ক্যারেটটি ইনপুট থেকে সরানো হয়। অন্য রাজ্যে, পুনঃনির্দেশটি স্বীকৃত নয় এবং একটি ক্যারেট দ্বিগুণ উদ্ধৃতি থেকে রেহাই পায় না এবং সরানো হয় না। আসুন এই রাজ্যগুলিকে যথাক্রমে 'বাহ্যিক' এবং 'ভিতরে' হিসাবে উল্লেখ করুন।
আপনি যদি আপনার কমান্ডের আউটপুট পুনর্নির্দেশ করতে চান, তবে কমান্ড শেলটি পুনর্নির্দেশে পৌঁছানোর পরে অবশ্যই বাইরের অবস্থায় থাকতে হবে, সুতরাং পুনঃনির্দেশের পূর্ববর্তী একক সংখ্যক আনসকেপড (ক্যারেট দ্বারা) ডাবল উদ্ধৃতি অবশ্যই থাকতে হবে। foo "a\"b " > out.txt
হবে কাজ না - কমান্ড শেল সমগ্র পাসের "a\"b " > out.txt
জন্য foo বিন্যাস , তার সম্মিলিত কমান্ড লাইন আর্গুমেন্ট হিসাবে পরিবর্তে শুধুমাত্র ক্ষণস্থায়ী "a\"b "
এবং আউটপুট পুনঃনির্দেশিত out.txt ।
foo "a\^"b " > out.txt
হবে না কাজ, হয়, কারণ ক্যারেট ^
ভিতরে রাজ্যের সম্মুখীন হয় যেখানে এটি একজন সাধারণ চরিত্র এবং একটি এস্কেপ অক্ষর, তাই "a\^"b " > out.txt
প্রেরণ পরার foo বিন্যাস ।
একমাত্র উপায় যা (আশাকরি) সর্বদা কাজ করে তা হ'ল কমান্ড শেলটি সর্বদা বাইরের অবস্থায় রাখা, কারণ তখন পুনঃনির্দেশ কাজ করে।
আপনার যদি পুনঃনির্দেশের প্রয়োজন হয় না (বা কমান্ড শেলটির বিশেষ অর্থ সহ অন্যান্য অক্ষর), তবে আপনি ক্যারেটগুলি ছাড়াই করতে পারেন। যদি foo\"
আক্ষরিক দ্বৈত উদ্ধৃতি হিসাবে ব্যাখ্যা করে , তবে আপনি এটি হিসাবে কল করতে পারেন
foo "a\"b c"
তারপরে foo"a\"b c"
তার সম্মিলিত আর্গুমেন্টের পাঠ্য হিসাবে প্রাপ্ত হয় এবং এর সমান একক যুক্তি হিসাবে এটি ব্যাখ্যা করতে পারে a"b c
।
এখন - অবশেষে - আসল প্রশ্নে। myscript '"test"'
উইন্ডোজ কমান্ড শেল '"test"'
থেকে কল করা মাইক্রিপ্ট থেকে পাস । স্পষ্টতই ম্যাসক্রিপ্টটি একক এবং দ্বৈত উদ্ধৃতিগুলি আর্গুমেন্ট ডিলিমিটর হিসাবে ব্যাখ্যা করে এবং সেগুলি সরিয়ে দেয়। আক্ষরিক দ্বৈত উক্তি হিসাবে কোন ম্যাসক্রিপ্টটি গ্রহণ করে তা আপনাকে খুঁজে বের করতে হবে এবং তারপরে ^
উইন্ডোজ কমান্ড শেলের যে বিশেষ অক্ষর রয়েছে তার পালাতে গিয়ে আপনার কমান্ডটিতে এটি নির্দিষ্ট করতে হবে । যেটি myscript
ইউনিক্সে উপলভ্য, সম্ভবত \"
কৌশলটি ব্যবহার করে। চেষ্টা
myscript \^"test\^"
বা, যদি আপনার পুনঃনির্দেশের প্রয়োজন না হয়,
myscript \"test\"
myscript \"test\"