এপিলালেস এর নিজস্ব উত্তর সহজভাবে এবং কার্যকরভাবে তার নির্দিষ্ট সমস্যা সমাধান করে: এটি "
পুরো আর্গুমেন্ট তালিকার সমস্ত দৃষ্টান্তের সাথে প্রতিস্থাপন করে \"
, যা বাশকে ডাবল-কোটড স্ট্রিংয়ের মধ্যে উপস্থাপনের জন্য ডাবল-কোটগুলির প্রয়োজন হয়।
ডাবল-কোটড স্ট্রিংয়ের সাহায্যে কীভাবে ডাবল-কোয়েটগুলি থেকে রক্ষা পাওয়া যায়cmd.exe
, এই প্রশ্নের উত্তর দিতে উইন্ডোজ কমান্ড-লাইন ইন্টারপ্রেটার (কমান্ড লাইনে থাকুক না কেন - প্রায়শই ভুলভাবে "ডস প্রম্পট" বলা হয় - বা ব্যাচের ফাইলে): পাওয়ারশেলটি দেখার জন্য নীচে দেখুন ।
tl; dr :
আপনি আবশ্যক ব্যবহার""
যখন একটি স্ট্রিং ক্ষণস্থায়ী একটি (nother) এর ব্যাচ ফাইল এবং আপনার পারে ব্যবহার ""
সঙ্গে তৈরি অ্যাপ্লিকেশনের সাথে মাইক্রোসফট এর সি / সি ++ / নেট কম্পাইলার। (যা এছাড়াও গ্রহণ \"
), যা Windows এ পাইথন আর Node.js অন্তর্ভুক্ত :
\"
হয় প্রয়োজনীয় - একমাত্র বিকল্প হিসাবে - আরও অনেক প্রোগ্রাম দ্বারা , (! যেমন, রুবি, পার্ল, এবং এমনকি মাইক্রোসফট নিজস্ব উইন্ডোজ PowerShell ()), কিন্তু এর ব্যবহার করবেন নিরাপদ :
\"
উইন্ডোজ পাওয়ারশেল সহ - বাইরে থেকে স্ট্রিংগুলি পাস করার সময় - বা মাইক্রোসফ্টের সংকলকগুলির ক্ষেত্রে বিকল্প হিসাবে সমর্থন হিসাবে - অনেকগুলি এক্সিকিউটেবল এবং দোভাষী যা প্রয়োজন তা হ'ল শেষ পর্যন্ত, যদিও এটি আর্গুমেন্ট লিস্টকে পার্স করার জন্য লক্ষ্য প্রোগ্রামটি আপ । ""
- উদাহরণ:
foo.exe "We had 3\" of rain."
- তবে ব্যাবহারের
\"
কমান্ড এবং / অথবা ইনপুট / আউটপুট পুনঃনির্দেশগুলি অবাঞ্ছিত, নির্বিচারে জারিক্রমে পারেন ফলে :
- নিম্নলিখিত অক্ষরগুলি এই ঝুঁকিটি উপস্থাপন করে:
& | < >
- উদাহরণস্বরূপ,
ver
কমান্ডটি অনিচ্ছাকৃত প্রয়োগের জন্য নিম্নলিখিত ফলাফলগুলি ; একটি ব্যাখ্যার জন্য নীচে আরও দেখুন এবং পরবর্তী কাজের বুলেট পয়েন্ট:
foo.exe "3\" of snow" "& ver."
- জন্য উইন্ডোজ PowerShell ,
\""
এবং "^""
শক্তসমর্থ আছে, কিন্তু সীমাবদ্ধ বিকল্প (নীচে অধ্যায় দেখুন "PowerShell এর CLI কল করা হচ্ছে ...")।
যদি আপনার অবশ্যই ব্যবহার করা \"
হয় তবে কেবলমাত্র 3 টি নিরাপদ পন্থা রয়েছে যা এটি বেশ জটিল : তার সহায়তার জন্য টিএসের টুপিটি ।
আপনার ব্যাচ ফাইলে (সম্ভবত নির্বাচনী ) বিলম্বিত ভেরিয়েবল প্রসারণ ব্যবহার করে , আপনি একটি পরিবর্তনশীল এবং রেফারেন্সে আক্ষরিক সংরক্ষণ\"
"..."
!var!
করতে পারেন যা সিনট্যাক্স ব্যবহার করে স্ট্রিংয়ের ভিতরে পরিবর্তনশীল হয় - টিএসের সহায়ক উত্তরটি দেখুন ।
- উপরোক্ত পদ্ধতির বোঝাপড়া হওয়া সত্ত্বেও, সুবিধা রয়েছে যে আপনি এটি পদ্ধতিগতভাবে প্রয়োগ করতে পারেন এবং এটি যে কোনও ইনপুট সহ দৃ rob়তার সাথে কাজ করে ।
কেবলমাত্র লিটারিয়াল স্ট্রিংগুলির সাথে - যেগুলি ভারিবেলে জড়িত নয় - আপনি কি একই ধরণের পদ্ধতিগত পদ্ধতির সন্ধান করেন: ^
স্পষ্টভাবে- সমস্ত মেটাচ্যাকারকে পরীক্ষা করুন cmd.exe
: " & | < >
এবং - আপনি যদি ভেরিয়েবল সম্প্রসারণ দমন করতে চান - %
:
foo.exe ^"3\^" of snow^" ^"^& ver.^"
অন্যথায়, স্ট্রিংয়ের কোন অংশটিcmd.exe
\"
বন্ধ করে দেওয়া ডিলিমেটার হিসাবে ভুল ব্যাখ্যা করার কারণে স্ট্রিংয়ের কোন অংশকে অযোগ্য বলে বিবেচনা করে তার ভিত্তিতে আপনার স্ট্রিং তৈরি করতে হবে :
মধ্যে আক্ষরিক শেল metacharacters ধারণকারী অংশ: ^
তাদের -escape; উপরের উদাহরণটি ব্যবহার করে, এটি হ'ল &
অবশ্যই ^
ছাড়ানো উচিত :
foo.exe "3\" of snow" "^& ver."
স্টাইল ভেরিয়েবল রেফারেন্স সহ%...%
অংশে : এটি নিশ্চিত করে যে cmd.exe
এগুলি একটি "..."
স্ট্রিংয়ের অংশ হিসাবে বিবেচিত এবং ভেরিয়েবল মানগুলি এম্বেড, ভারসাম্যহীন উদ্ধৃতি নেই - যা সর্বদা সম্ভব হয় না ।
পটভূমি তথ্যের জন্য, পড়ুন।
পটভূমি
দ্রষ্টব্য: এটি আমার নিজের পরীক্ষাগুলির উপর ভিত্তি করে। আমি ভুল হলে আমাকে জানাবেন।
পিসিক্স-এর মতো শাঁস যেমন ব্যাশ অন ইউনিক্স-এর মতো সিস্টেমে লক্ষ্য প্রোগ্রামে স্বতন্ত্রভাবে আর্গুমেন্টগুলি পাস করার আগে যুক্তি তালিকা (স্ট্রিং) কে টোকনাইজ করে তোলে : অন্যান্য বিস্তারের মধ্যে তারা যুক্তি তালিকাটি পৃথক শব্দগুলিতে বিভক্ত করে (শব্দ বিভাজন) এবং উদ্ধৃতিচিহ্নগুলি থেকে অপসারণ করে ফলাফল শব্দ (উদ্ধৃতি অপসারণ)। লক্ষ্য প্রোগ্রাম একটি হাতি হয় অ্যারের এর পৃথক আর্গুমেন্ট সঙ্গে, অন্বিত কোট মুছে ।
বিপরীতে, উইন্ডোজ কমান্ড ইন্টারপ্রেটার স্পষ্টতই আর্গুমেন্টের তালিকাকে টোকানাইজ করে না এবং কেবলমাত্র চারটি উদ্ধৃতি সহ সমস্ত আর্গুমেন্টের সমন্বয়ে একক স্ট্রিং পাস করে । - লক্ষ্য প্রোগ্রাম।
তবে, একক স্ট্রিংটি লক্ষ্য প্রোগ্রামে যাওয়ার আগে কিছু প্রিপ্রসেসিং হয়: ^
এস্কেপ চরগুলি। দ্বিগুণ-উদ্ধৃত স্ট্রিংগুলির বাইরে সরিয়ে ফেলা হয় (তারা নিম্নলিখিত চর থেকে পালায় escape), এবং ভেরিয়েবল রেফারেন্স (যেমন, %USERNAME%
) প্রথমে ইন্টারপোল্ট করা হয় ।
সুতরাং, ইউনিক্সের বিপরীতে, আর্গুমেন্টের স্ট্রিংটিকে বিশ্লেষণ করার এবং এটিকে উদ্ধৃত বাক্যগুলি পৃথক যুক্তিতে বিভক্ত করার লক্ষ্য প্রোগ্রামটির দায়িত্ব। সুতরাং, বিভিন্ন প্রোগ্রাম অনুমানের সাথে পৃথকীকরণের পৃথক পদ্ধতিগুলির প্রয়োজন হতে পারে এবং সমস্ত প্রোগ্রামের সাথে কাজ করার গ্যারান্টিযুক্ত কোনও একক পালানোর ব্যবস্থা নেই - https://stackoverflow.com/a/4094897/45375 নৈরাজ্যের উপর দুর্দান্ত ব্যাকগ্রাউন্ড রয়েছে যা উইন্ডোজ কমান্ড-লাইন পার্সিং
অনুশীলনে, \"
খুব সাধারণ, তবে নিরাপদ নয় , যেমন উপরে বর্ণিত:
যেহেতু cmd.exe
নিজেই \"
একটি পালিয়ে যাওয়া ডাবল-কোট হিসাবে স্বীকৃতি দেয় না , তাই এটি কমান্ড লাইনে পরে টোকেনগুলি অব্যক্ত হিসাবে চিহ্নিত করতে এবং সম্ভাব্যভাবে তাদের আদেশ ও / অথবা ইনপুট / আউটপুট পুনঃনির্দেশ হিসাবে ব্যাখ্যা করতে পারে ।
সংক্ষেপে: সমস্যা পৃষ্ঠতল, যদি নিম্নলিখিত অক্ষরগুলি কোন একটি অনুসরণ ওপেনিং বা ভারসাম্যহীন \"
:& | < >
; উদাহরণ স্বরূপ:
foo.exe "3\" of snow" "& ver."
cmd.exe
\"
নিয়মিত ডাবল-কোট হিসাবে ভুল ব্যাখ্যা করার ফলে নিম্নলিখিত টোকেনগুলি দেখে :
"3\"
of
snow" "
- বিশ্রাম:
& ver.
যেহেতু cmd.exe
মনে হয় যে & ver.
এটি উদ্ধৃত নয় , এটি এটি &
(কমান্ড-সিকোয়েন্সিং অপারেটর) হিসাবে ব্যাখ্যা করে , তারপরে কার্যকর করার জন্য একটি কমান্ডের নাম ( ver.
- .
উপেক্ষা করা হয়; ver
প্রতিবেদনের cmd.exe
সংস্করণ তথ্য)।
সামগ্রিক প্রভাব:
- প্রথমত,
foo.exe
কেবল প্রথম 3 টি টোকেন দিয়ে আমন্ত্রণ জানানো হয় ।
- তারপরে, কমান্ড
ver
কার্যকর করা হয়।
এমনকি দুর্ঘটনাজনিত কমান্ড কোনও ক্ষতি না করে এমন ক্ষেত্রেও, আপনার সামগ্রিক কমান্ডটি নকশাকৃত হিসাবে কাজ করবে না, প্রদত্ত যে সমস্ত আর্গুমেন্ট এতে প্রেরণ করা হয় না।
অনেক সংকলক / দোভাষী কেবলমাত্র স্বীকৃতি দেয়\"
- যেমন, জিএনইউ সি / সি ++ সংকলক, পাইথন, পার্ল, রুবি এমনকি মাইক্রোসফ্টের নিজস্ব উইন্ডোজ পাওয়ারশেল যখন উইন্ডোজ পাওয়ারশেলের জন্য অন্তর্ভুক্ত থাকে cmd.exe
- এবং \""
তাদের জন্য কোনও সহজ সমাধান নেই for এই সমস্যা
মূলত, আপনাকে আগেই জানতে হবে যে আপনার কমান্ড লাইনের কোন অংশটি অব্যক্ত হিসাবে ভুল ব্যাখ্যা করা হয়েছে, এবং সেই অংশগুলির ^
সমস্ত উদাহরণকে বেছে বেছে বেছে নিতে হবে & | < >
।
বিপরীতে, এর ব্যবহার ""
নিরাপদ , তবে আফসোসটি কেবল মাইক্রোসফ্ট-সংকলক-ভিত্তিক এক্সিকিউটেবল এবং ব্যাচ ফাইল দ্বারা সমর্থিত ( ব্যাচ ফাইলগুলির ক্ষেত্রে, উপরে উল্লিখিত তাত্পর্যগুলি সহ) উল্লেখযোগ্য পাওয়ারশেলকে বাদ দেয় - পরবর্তী বিভাগটি দেখুন।
পাওয়ারশেলের সি এল এল থেকে কল করা cmd.exe
বা পসিএক্স-এর মতো শেলগুলি:
দ্রষ্টব্য: পাওয়ারশেলের ভিতরে কীভাবে উদ্ধৃতি পরিচালনা করা হয় তার নীচের অংশটি দেখুন ।
যখন বাইরে থেকে আহ্বান করা হয় - যেমন cmd.exe
কমান্ড লাইন বা ব্যাচ ফাইল থেকে:
পাওয়ারশেল [কোর] ভি 6 + এখন সঠিকভাবে সনাক্ত করেছে""
(পাশাপাশি\"
), যা ব্যবহার করা এবং হোয়াইটস্পেস-সংরক্ষণ উভয়ই নিরাপদ ।
pwsh -c " ""a & c"".length "
বিরতি দেয় না এবং সঠিকভাবে ফলন দেয় 6
উইন্ডোজ পাওয়ারশেল (লেগ্যাসি সংস্করণ যার শেষ সংস্করণ 5.1) কেবলমাত্র এবং উইন্ডোজে এবং আরও শক্তিশালী / (যদিও অভ্যন্তরীণভাবে পাওয়ারশেলডাবল-কোটেড স্ট্রিংগুলিতে পলায়ন চরিত্র হিসাবেব্যবহারকরে এবং গ্রহণ করে- নীচের অংশটি দেখুন) স্বীকৃতি দেয় \"
"""
\""
"^""
: `
""
/ একটি ব্যাচের ফাইল থেকে উইন্ডোজ পাওয়ারশেলকে কল করা :cmd.exe
""
বিরতি , কারণ এটি মূলত অসমর্থিত:
powershell -c " ""ab c"".length "
-> ত্রুটি "স্ট্রিংটি টার্মিনেটরটি হারিয়েছে"
\"
এবং নীতিগতভাবে"""
কাজ করে তবে নিরাপদ নয় :
powershell -c " \"ab c\".length "
উদ্দেশ্যে হিসাবে কাজ করে: এটি আউটপুট 5
( 2 স্পেস নোট করুন )
- তবে এটি নিরাপদ নয়, কারণ
cmd.exe
মেটাচার্যাক্টরা কমান্ডটি ভেঙে ফেলেছে, যদি না পালানো হয়:
powershell -c " \"a& c\".length "
বিরতি , কারণ &
, যার ফলে পালাতে হবে^&
\""
হয় নিরাপদ , কিন্তু স্বাভাবিক অভ্যন্তর হোয়াইটস্পেস , যা অবাঞ্ছিত করা যেতে পারে:
powershell -c " \""a& c\"".length "
আউটপুট 4
(!), কারণ 2 স্পেসগুলি 1 এ স্বাভাবিক করা হয়েছে।
"^""
উইন্ডোজ পাওয়ারশেলের জন্য বিশেষভাবে সেরা পছন্দ , যেখানে এটি উভয়ই নিরাপদ এবং হোয়াইটস্পেস সংরক্ষণযোগ্য তবে পাওয়ারশেল কোর (উইন্ডোজে) এর সাথে এটি হ'ল\""
হোয়াইটস্পেস- নরমালাইজিংয়ের সমান । এই পদ্ধতির আবিষ্কারের জন্য ক্রেডিট ভেন্রিক্সে যায় ।
powershell -c " "^""a& c"^"".length "
কাজ করে : বিরতি দেয় না - সত্ত্বেও &
- এবং আউটপুট 5
, অর্থাত্, সঠিকভাবে সংরক্ষিত সাদা স্থান।
PowerShell কোর : pwsh -c " "^""a& c"^"".length "
কাজ করে , কিন্তু আউটপুট 4
, অর্থাত্ normalizes হোয়াইটস্পেস , যেমন \""
আছে।
উপর ইউনিক্সের মত প্ল্যাটফর্মের (লিনাক্সের, MacOS), কলিং যখন PowerShell [কোর] 'র CLI, pwsh
থেকে একটি POSIX মত শেল যেমন bash
:
আপনার অবশ্যই ব্যবহার করা উচিত\"
, যা তবে উভয়ই নিরাপদ এবং সাদা স্থান সংরক্ষণ করে :
$ pwsh -c " \"a& c|\".length"
সম্পর্কে তথ্য
^
ডাবল- উদ্ধৃতিযুক্ত স্ট্রিংগুলির অভ্যন্তরে কেবল অব্যক্ত স্ট্রিংগুলিতে কেবল পালানোর চরিত্র হিসাবেই ব্যবহার করা যেতে পারে^
এবং এটি আক্ষরিক হিসাবে বিশেষ হিসাবে বিবেচিত হয় না।
- কায়েট : স্টেটমেন্টে পাস হওয়া প্যারামিটারগুলির ব্যবহার ভেঙে গেছে
^
call
(এটি উভয়ের ব্যবহারের ক্ষেত্রে প্রযোজ্য call
: অন্য ব্যাচ ফাইল বা বাইনারি এবং একই ব্যাচের ফাইলে সাব্রোটিন কল করা):
^
মধ্যে দৃষ্টান্ত ডাবল উদ্ধৃত মান অস্বাভাবিক দ্বিগুণ , মান পরিবর্তনের প্রেরণ করা হচ্ছে: যেমন, পরিবর্তনশীল যদি %v%
আক্ষরিক মান রয়েছে a^b
, call :foo "%v%"
নির্ধারণ "a^^b"
করার জন্য (!) %1
সাবরুটিন মধ্যে (প্রথম প্যারামিটার) :foo
।
- Unquoted ব্যবহার
^
সঙ্গে call
করা হয় পুরাপুরি ভেঙ্গে যে ^
আর বিশেষ অক্ষর অব্যাহতি ব্যবহার করা যাবে যেমন:call foo.cmd a^&b
শান্তভাবে বিরতি (পরিবর্তে আক্ষরিক ক্ষণস্থায়ীa&b
খুবfoo.cmd
, যেমন ছাড়া কেস হবেcall
-)foo.cmd
অন্তত উইন্ডোজ এমনকি প্রার্থনা করা হয় না, (!) 7।
একটি আক্ষরিক পলায়নপরকিন্তু %
একটি বিশেষ ক্ষেত্রে দেখা যায় , দুর্ভাগ্যবশত, যা একটি স্ট্রিং উল্লিখিত হয় কিনা তার উপর নির্ভর করে স্বতন্ত্র বাক্য গঠন প্রয়োজন কমান্ড লাইন বনাম একটি ব্যাচ ফাইল ভিতরে ; দেখতে https://stackoverflow.com/a/31420292/45375
- এর সংক্ষিপ্ততা: ব্যাচ ফাইলের অভ্যন্তরে ব্যবহার করুন
%%
। কমান্ড লাইনে, এড়ানো%
যায় না, তবে আপনি যদি ^
শুরুর দিকে, শেষের দিকে, বা কোনও অযোগ্য স্ট্রিংতে (যেমন, echo %^foo%
) কোনও ভেরিয়েবলের ভিতরে রাখেন , তবে আপনি ভেরিয়েবল প্রসারণ (ইন্টারপোলেশন) প্রতিরোধ করতে পারেন; %
কমান্ড লাইনে দৃষ্টান্তগুলি যা কোনও চলক রেফারেন্সের অংশ নয়, তাকে আক্ষরিক হিসাবে বিবেচনা করা হয় (যেমন, 100%
)।
সাধারণত, স্পেস এবং বিশেষ অক্ষর থাকতে পারে এমন পরিবর্তনশীল মানগুলির সাথে নিরাপদে কাজ করার জন্য :
- অ্যাসাইনমেন্ট : ঘিরা উভয় পরিবর্তনশীল নাম এবং একটি মান একক ডাবল কোট যুগল ; উদাহরণস্বরূপ, চলককে
set "v=a & b"
আক্ষরিক মান নির্ধারণ করে (বিপরীতে, ডাবল-কোটগুলি মানটির অংশ করে তোলে)। আক্ষরিক উদাহরণগুলি এড়িয়ে চলুন (কেবল ব্যাচ ফাইলে কাজ করে - উপরে দেখুন)।a & b
%v%
set v="a & b"
%
%%
- রেফারেন্স : ডাবল-উদ্ধৃতি ভেরিয়েবল উল্লেখগুলি তাদের মান আন্তঃবিবাহিত হয় না তা নিশ্চিত করতে; উদাহরণস্বরূপ, দ্রবীভূতকরণ এবং মুদ্রণের
echo "%v%"
মান সাপেক্ষে না (তবে নোট করুন যে ডাবল-কোটগুলিও অবিচ্ছিন্নভাবে মুদ্রিত থাকে)। বিপরীতে, আক্ষরিক পাস করে , কমান্ড-সিকোয়েন্সিং অপারেটর হিসাবে ব্যাখ্যা করে এবং তাই নামের একটি কমান্ড কার্যকর করার চেষ্টা করে । বিবৃতি সহ
উপরের সাবধানবাণী পুনরায় ব্যবহারের বিষয়টিও নোট করুন ।%v%
"a & b"
echo %v%
a
echo
&
b
^
call
- বাহ্যিক প্রোগ্রামগুলি সাধারণত প্যারামিটারগুলির চারপাশে ঘেরযুক্ত ডাবল-কোটগুলি সরিয়ে ফেলার যত্ন নেয়, তবে যেমনটি উল্লেখ করা হয়েছে, ব্যাচ ফাইলগুলিতে আপনাকে এটি নিজেই করতে হবে (উদাহরণস্বরূপ,
%~1
1 ম প্যারামিটার থেকে ঘেরযুক্ত ডাবল-কোটস অপসারণ করতে) এবং, দুঃখের বিষয়, কোনও সরাসরি নেই যেভাবে আমি জানি যে echo
কোনও পরিবর্তনশীল মান ডাবল-কোটগুলি ছাড়াই বিশ্বস্তভাবে মুদ্রণ করতে হবে ।
- নিল উপলব্ধ করা হয় একটি
for
ভিত্তিক কার্যসংক্রান্ত যে কাজ মান কোন উদ্ধৃতি চিহ্ন এমবেডেড হয়েছে যতদিন ; যেমন:
set "var=^&')|;,%!"
for /f "delims=" %%v in ("%var%") do echo %%~v
cmd.exe
একক- কোটগুলি স্ট্রিং ডিলিমিটার হিসাবে স্বীকৃতি দেয় না - এগুলিকে আক্ষরিক হিসাবে বিবেচনা করা হয় এবং এম্বেডড হোয়াইটস্পেসের সাহায্যে স্ট্রিংগুলি সীমাবদ্ধ করতে সাধারণত ব্যবহার করা যায় না; এছাড়াও, এটি অনুসরণ করে যে সিঙ্গল-কোটস এবং এর মধ্যে যে কোনও টোকেনকে অকার্যকর করে টোকেনগুলি অনুসৃত হিসাবে বিবেচিত হবে cmd.exe
এবং সেই অনুসারে ব্যাখ্যা করা হবে।
- যাইহোক, লক্ষ্যযুক্ত প্রোগ্রামগুলি শেষ পর্যন্ত তাদের নিজস্ব যুক্তি পার্সিং সম্পাদন করে, কিছু প্রোগ্রাম যেমন রুবি উইন্ডোতে এমনকি একক-উদ্ধৃত স্ট্রিংকে স্বীকৃতি দেয়; বিপরীতে, সি / সি ++ এক্সিকিউটেবল, পার্ল এবং পাইথন তাদের সনাক্ত করে না ।
এমনকি যদি লক্ষ্য প্রোগ্রাম দ্বারা সমর্থিত, কিন্তু, তা না একক উদ্ধৃতিচিহ্ন সহ পংক্তি ব্যবহার করাই সমীচীন দেওয়া তাদের বিষয়বস্তু দ্বারা সম্ভাব্য অবাঞ্ছিত ব্যাখ্যা থেকে রক্ষা করা হয় না যে, cmd.exe
।
পাওয়ারশেলের মধ্যে থেকে উদ্ধৃতি :
উইন্ডোজ পাওয়ারশেল এর চেয়ে অনেক বেশি উন্নত শেল cmd.exe
এবং এটি এখন বহু বছর ধরে উইন্ডোজের একটি অংশ হয়ে দাঁড়িয়েছে (এবং পাওয়ারশেল কোর ম্যাকওএস এবং লিনাক্সেও পাওয়ারশেলের অভিজ্ঞতা এনেছে)।
পাওয়ারশেল উদ্ধৃতি সহকারে ধারাবাহিকভাবে অভ্যন্তরীণভাবে কাজ করে:
- ডাবল-কোটেড স্ট্রিংয়ের ভিতরে, ডাবল-কোট ব্যবহার করুন
`"
বা ""
এড়িয়ে চলুন
- একক-উদ্ধৃত স্ট্রিংয়ের ভিতরে, একক-উদ্ধৃতি
''
থেকে বাঁচতে ব্যবহার করুন
এটি পাওয়ারশেল কমান্ড লাইনে এবং পাওয়ারশেলের মধ্যে থেকে পাওয়ারশেল স্ক্রিপ্টগুলিতে বা ফাংশনগুলিতে পরামিতিগুলি পাস করার সময় কাজ করে ।
(যেমন উপরে আলোচনা করা হয়েছে, বাইরে থেকে পাওয়ারশেলের কাছে পালিয়ে যাওয়া ডাবল-কোট পাস করার জন্য প্রয়োজন \"
বা আরও দৃly়তার সাথে, \""
- অন্য কোনও কিছুই কার্যকর হয় না)।
দুঃখের বিষয়, পাওয়ারশেল থেকে বাহ্যিক প্রোগ্রামগুলি গ্রহণ করার সময়, আপনি পাওয়ারশেলের নিজস্ব উদ্ধৃতি বিধি উভয়কেই সামঞ্জস্য করা এবং লক্ষ্য প্রোগ্রামের জন্য পালানোর প্রয়োজনের মুখোমুখি হলেন :
এই সমস্যাযুক্ত আচরণটিও এই উত্তরে আলোচিত এবং সংক্ষিপ্তসারিত হয়
ডাবল- কোয়েটযুক্ত স্ট্রিংগুলির ভিতরে ডাবল- কোটস :
স্ট্রিং বিবেচনা করুন "3`" of rain"
, যা পাওয়ারশেল-অভ্যন্তরীণভাবে আক্ষরিক অনুবাদ করে 3" of rain
।
আপনি যদি এই স্ট্রিংটিকে একটি বাহ্যিক প্রোগ্রামে পাস করতে চান তবে আপনাকে পাওয়ারশেলের পাশাপাশি লক্ষ্য প্রোগ্রামটির পলায়ন প্রয়োগ করতে হবে ; বলুন আপনি একটি সি প্রোগ্রামে স্ট্রিংটি পাস করতে চান, যা এম্বেড করা ডাবল-কোটগুলি এড়িয়ে যেতে পারে বলে প্রত্যাশা করে \"
:
foo.exe "3\`" of rain"
নোট কিভাবে উভয় `"
- PowerShell খুশি করতে - এবং\
- লক্ষ্য প্রোগ্রাম খুশি করতে - বর্তমান হতে হবে।
একই যুক্তি ব্যাচ ফাইল চালনার ক্ষেত্রে প্রযোজ্য, যেখানে ""
অবশ্যই এটি ব্যবহার করা উচিত:
foo.bat "3`"`" of rain"
বিপরীতে, একক- কোয়েটগুলিকে ডাবল- কোয়েটেড স্ট্রিংয়ে এম্বেড করার জন্য কোনওভাবেই পালানোর দরকার নেই।
একক ভিতরে -quotes একক -quoted স্ট্রিং না না প্রয়োজন, অতিরিক্ত পলায়নের; বিবেচনা করুন'2'' of snow'
, যা পাওয়ারশেলের প্রতিনিধিত্ব2' of snow
।
foo.exe '2'' of snow'
foo.bat '2'' of snow'
পাওয়ারশেল লক্ষ্য প্রোগ্রামে যাওয়ার আগে ডাবল-কোটেডগুলিতে একক-উদ্ধৃত স্ট্রিংগুলিকে অনুবাদ করে।
তবে, একক- উদ্ধৃত স্ট্রিংগুলির ভিতরে ডাবল- কোটগুলি , যাদের পাওয়ারশেলের জন্য পালানোর দরকার নেই , এখনও লক্ষ্য প্রোগ্রামের জন্য পালাতে হবে :
foo.exe '3\" of rain'
foo.bat '3"" of rain'
PowerShell v3 এর যাদু চালু --%
বিকল্প বলা স্টপ পার্স প্রতীক , যা ব্যথা কিছু বিপদ দূর করে, কিছু পাশ করার পর এটি দ্বারা uninterpreted লক্ষ্য প্রোগ্রাম, জন্য সংরক্ষণ cmd.exe
-style পরিবেশবান্ধব পরিবর্তনশীল রেফারেন্স (যেমন, %USERNAME%
), যা হয় প্রসারিত; যেমন:
foo.exe --% "3\" of rain" -u %USERNAME%
কেবলমাত্র লক্ষ্যমাত্রার প্রোগ্রাম "
হিসাবে এম্বেড থাকা থেকে কীভাবে পালানো সম্ভব \"
(এবং পাওয়ারশেলের জন্যও নয় \`"
) যথেষ্ট Note
তবে, এই পদ্ধতির:
- পরিবেশ-পরিবর্তনশীল প্রসারণ এড়াতে অক্ষরগুলি পালানোর অনুমতি দেয় না
%
।
- precludes সরাসরি PowerShell ভেরিয়েবল এবং অভিব্যক্তির ব্যবহার; পরিবর্তে, কমান্ড লাইনটি প্রথম ধাপে একটি স্ট্রিং ভেরিয়েবলের মধ্যে তৈরি করা আবশ্যক এবং তারপরে
Invoke-Expression
একটি সেকেন্ডে ডাকা হবে ।
সুতরাং, এর অনেক অগ্রগতি সত্ত্বেও, পাওয়ারশেল বাহ্যিক প্রোগ্রামগুলিতে কল করার সময় খুব সহজে পলায়ন করতে পারেনি। এটি অবশ্য একক-উদ্ধৃত স্ট্রিংয়ের জন্য সমর্থন চালু করেছে।
আমি ভাবছি যদি এটা মৌলিকভাবে সম্ভব উইন্ডোজ বিশ্বের কি কখনো স্যুইচ করার লেট ইউনিক্স মডেল এর শেল সব tokenization এবং উদ্ধৃতি অপসারণ না predictably , সামনে , লক্ষ্য প্রোগ্রাম নির্বিশেষে , এবং তার ফলে টোকেন পাশ দিয়ে তারপর লক্ষ্য প্রোগ্রাম ডাকা ।