প্যারামিটারে ডাবল উদ্ধৃতিগুলি এড়িয়ে চলুন


109

ইউনিক্সে আমি দৌড়াতে পারি myscript '"test"'এবং আমি পেতাম "test"

উইন্ডোজ cmdআমি পেতে 'test'

আমি কীভাবে পরামিতি হিসাবে ডাবল-কোট পাস করতে পারি? আমি cmdউইন্ডো থেকে ম্যানুয়ালি এটি কীভাবে করব তা জানতে চাই যাতে আমার প্রোগ্রামটি পরীক্ষা করার জন্য আমাকে কোনও প্রোগ্রাম লিখতে হবে না।


2
আমি একটি উইন্ডো মেশিন স্পর্শ করেছি বছর পেরিয়ে গেছে, কিন্তু স্ট্যান্ডার্ড পলায়ন চরিত্র (ব্যাকস্ল্যাশ \) কাজ করে না? উদাহরণস্বরূপmyscript \"test\"
গজলার 21

নাঃ। আমি \ পরীক্ষা get পাই \ আমার সন্দেহ হয় যে উইন্ডোজগুলি / এর পরিবর্তে so ব্যবহার করে তাই ব্যাকস্ল্যাশ এসকেস্টার হিসাবে ব্যবহার করা যায় না। তবে আমি আসলে জানি না।
ব্রায়ান ফিল্ড

উইন্ডোজ আপনি কোন সংস্করণটি ব্যবহার করছেন তা আইডিক, তবে উইন্ডোজ ((আলটিমেট) এ fine "ভাল কাজ করে multiple একাধিক উদ্ধৃতি (যেমন" "" হয়ে যায় "বা কিছু) নিয়ে কাজ করার পরেও এটি করার আরও একটি উপায় আছে, তবে আমি করতে পারি না কখন এবং কীভাবে এটি কাজ করে তা নির্ধারণ করুন
কোডস্মিত

উত্তর:


22

আমি দ্রুত লক্ষণগুলি পুনরুত্পাদন করতে পারি না: আমি যদি কেবল বা এমনকি myscript '"test"'সমেত একটি ব্যাচ ফাইল দিয়ে চেষ্টা করি তবে আমি সমস্ত উদ্ধৃতি পেয়েছি:myscript.bat@echo.%1@echo.%~1'"test"'

সম্ভবত আপনি এস্কেপ অক্ষর চেষ্টা করতে পারেন ^এই মত: myscript '^"test^"'?


3
তাহলে সম্ভবত এই প্রশ্নের উত্তরগুলি আপনাকে আরও সাহায্য করতে পারে?
মৌসিও

2
হা! আমি কখনই অনুমান করতাম না যে এটি wscriptদোষ! এটি উইন্ডোতে ছেড়ে দিন :)
ব্রায়ান ফিল্ড

4
: আসলে ^ না আমার জন্য কাজ করেনি, কিন্তু \ এই উত্তর প্রতি করেনি stackoverflow.com/questions/2403647/...
kalenjordan

26
উইন্ডোজ: ওএস যেখানে গ্লোব্বিং, শেল এক্সপেনশন এবং পরামিতি আনসেকাপিং হয় শেলের পরিবর্তে এক্সিকিউটেবল দ্বারা চালিত হয়। আপনি কখনই জানবেন না যে কোন সম্মেলন, যদি কোনও হয়, মৃত্যুদন্ড কার্যকরযোগ্য সম্মান।
বিনকি

7
মূল্যবান ইনপুট: ব্লগস.এমএসডিএন.মাইক্রোসফটস / টুইস্টাইলিটেলপাসেজসাল্লা লাইক / ২০১০ / ২০১৪ । ক্যারেটটি প্রকৃতপক্ষে পছন্দের জন্য পালানোর চরিত্র cmd
পিটার - মনিকা পুনরায় ইনস্টল করুন

198

উদ্ধৃতিগুলি থেকে বাঁচার আরেকটি উপায় (যদিও সম্ভবত এটি ভাল নয়), যা আমি নির্দিষ্ট জায়গায় ব্যবহার করেছি তা হ'ল একাধিক ডাবল-কোট ব্যবহার করা । অন্যান্য লোকের কোডটি সুগঠিত করার উদ্দেশ্যে, আমি ব্যাখ্যা করব।

এখানে মৌলিক নিয়মের একটি সেট রয়েছে:

  1. যখন ডাবল উদ্ধৃত গ্রুপ আবৃত না, স্পেস আলাদা প্যারামিটার:
    program param1 param2 param 3চার পরামিতি পাস হবে program.exe:
         param1, param2, param, এবং 3
  2. একটি ডবল উদ্ধৃত গ্রুপ মান বিভাজক যখন প্রোগ্রামের পরামিতি ক্ষণস্থায়ী যেমন স্পেস উপেক্ষা করে:
    program one two "three and more"তিন পরামিতি পাস হবে program.exe:
         one, two, এবং three and more
  3. এখন কিছু বিভ্রান্তির ব্যাখ্যা দিতে:
  4. ডাবল উদ্ধৃত সরাসরি এক পরামিতি মধ্যে যোগদানের ডাবল কোট দিয়ে আবৃত না টেক্সট সংলগ্ন প্রদর্শিত Groups:
    hello"to the entire"worldএক প্যারামিটার হিসাবে কাজ করে: helloto the entireworld
  5. দ্রষ্টব্য: পূর্ববর্তী নিয়মটি বোঝায় না যে দুটি ডাবল-কোটেড গ্রুপ একে অপরের সাথে সরাসরি সংলগ্ন হতে পারে।
  6. যে কোনও ডাবল-কোট প্রত্যক্ষভাবে একটি সমাপ্ত উদ্ধৃতি অনুসরণ করা হয়েছে (বা এর অংশ হিসাবে) ডাবল-উদ্ধৃত গোষ্ঠীর সংলগ্ন প্লেইন আবরণযুক্ত পাঠ্য হিসাবে বিবেচিত হবে, তবে কেবল একটি মাত্র ডাবল উদ্ধৃতি:
    "Tim says, ""Hi!"""একটি প্যারামিটার হিসাবে কাজ করবে:Tim says, "Hi!"

সুতরাং তিনটি ভিন্ন ধরণের ডাবল-কোট রয়েছে: উদ্বোধনীগুলি যা খোলার সাথে বন্ধ হয় এবং কোটগুলি যে সরল-পাঠ্য হিসাবে কাজ করে।
এখানে শেষ বিভ্রান্তিকর লাইনের ভাঙ্গন এখানে রয়েছে:

"ডাবল-কোট গ্রুপ খুলুন
টি ভিতরে "" এস
আমি ভিতরে "" এস
আমি ভিতরে "" এস
    "" এর ভিতরে - স্থান আলাদা হয় না
s এর ভিতরে "" এস
একটি ভিতরে "" এস
y এর ভিতরে "" এস
s এর ভিতরে "" এস
, ভিতরে "" এস
    "" এর ভিতরে - স্থান আলাদা হয় না
"ডাবল-উদ্ধৃত গোষ্ঠীটি বন্ধ করুন
"উদ্ধৃতিটি সরাসরি নিকটবর্তী হয় - সরল আনরোপড পাঠ্য হিসাবে কাজ করে:"
এইচ এর বাইরে "" - পূর্ববর্তী সংলগ্ন গ্রুপে যোগ দেয়
আমি "" এর বাইরে ...
! "" এর বাইরে ...
"ডাবল-কোট গ্রুপ খুলুন
"ডাবল-উদ্ধৃতি গোষ্ঠীটি বন্ধ করুন
"উদ্ধৃতিটি সরাসরি নিকটবর্তী হয় - সরল আনরোপড পাঠ্য হিসাবে কাজ করে:"

সুতরাং, পাঠ্যটি কার্যকরভাবে চরিত্রের চারটি গ্রুপে যোগ দেয় (যদিও কিছুই নেই):
Tim says,  প্রথমটি, ফাঁকা স্থান থেকে রক্ষা
"Hi!পাওয়া দ্বিতীয়, মোড়ানো নয় (কোনও স্থান নেই)
 তৃতীয়, একটি ডাবল-উদ্ধৃতি গোষ্ঠী কিছুই মোড়ানো নয়
"চতুর্থটি, মোড়কবিহীন বন্ধ উদ্ধৃতি।

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

এ থেকে, এটি স্বীকৃত হওয়া উচিত যে অতএব, ভিতরে এবং বাইরে উদ্ধৃতিগুলির মধ্যে, তিনটি ডাবল-কোটগুলি সরল-পাঠ্য অনির্বাচিত দ্বি-উদ্ধৃতি হিসাবে কাজ করে:

"টিম তাকে বললেন," "" ইদানীং কী হচ্ছে? "" ""

Tim said to him, "What's been happening lately?"প্রত্যাশিত হিসাবে মুদ্রণ করবে। সুতরাং, তিনটি উদ্ধৃতি সর্বদা নির্ভরযোগ্যভাবে একটি পলায়ন হিসাবে ব্যবহার করা যেতে পারে।
তবে এটি বোঝার জন্য, আপনি লক্ষ রাখতে পারেন যে শেষের চারটি উদ্ধৃতিগুলি মাত্র দুটিতে হ্রাস করা যেতে পারে কারণ এটি প্রযুক্তিগতভাবে অন্য অপ্রয়োজনীয় খালি ডাবল-উদ্ধৃত গোষ্ঠী যুক্ত করছে।

এটি বন্ধ করার জন্য এখানে কয়েকটি উদাহরণ দেওয়া হল:

প্রোগ্রাম আব আরএম প্রেরণ করে (ক) এবং (খ)
প্রোগ্রাম "" "একটি" "" আরইএম প্রেরণ করে ("একটি")
প্রোগ্রাম "" "একটি বি" "" আরইএম প্রেরণ করে ("ক) এবং (খ")
প্রোগ্রাম "" "" হ্যালো, "" "মাইক বলেছেন।" আরইএম প্রেরণ করে ("হ্যালো," মাইক বলল।)
প্রোগ্রাম "" এ "" বি "" সি "" ডি "" আরইএম প্রেরণ করে (abcd) যেহেতু "" গোষ্ঠীগুলি কিছুই আবদ্ধ করে না
প্রোগ্রাম "হ্যালোকে" "" "" উদ্ধৃতিগুলিতে "" আরইএম প্রেরণ করে (হ্যালোকে "উক্তিগুলিতে")
প্রোগ্রাম "" "" হ্যালো ওয়ার্ল্ড "" আরইএম প্রেরণ করে ("হ্যালো ওয়ার্ল্ড")
প্রোগ্রাম "" "হ্যালো" বিশ্ব "" আরইএম প্রেরণ করে ("হ্যালো ওয়ার্ল্ড")
প্রোগ্রাম "" "হ্যালো" বিশ্ব "" আরইএম প্রেরণ করে ("হ্যালো) এবং (বিশ্ব")
প্রোগ্রাম "হ্যালো" "বিশ্ব" "" আরইএম প্রেরণ করে (হ্যালো "বিশ্ব")
প্রোগ্রাম "হ্যালো" "" বিশ্ব "" আরইএম প্রেরণ করে (হ্যালো "বিশ্ব")

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

আমি এটি উইন্ডোজ,, bit৪ বিট এ প্যারামিটার পাসিংয়ের সাথে * * এক্সপ্রেস কলগুলি ব্যবহার করে পরীক্ষা করেছি (* .bat নয়, তবে আমি মনে করি এটি একইভাবে কাজ করে)।


11
+1, তবে মনে রাখবেন যে এই আচরণটি প্রয়োগের উপর নির্ভর করে। উইন্ডোজে, প্রতিটি অ্যাপ্লিকেশন তার নিজস্ব কমান্ড লাইন প্যারামিটারগুলি পার্স করে। আমি বিশ্বাস করি যে আচরণটি আপনি বর্ণনা করছেন তা হ'ল মাইক্রোসফ্টের স্ট্যান্ডার্ড সি লাইব্রেরি, যা আমি মনে করি অন্যান্য উইন্ডোজ সি সংকলকরাও এটি সদৃশ করেছেন।
হ্যারি জনস্টন

3
আপনার শেষ প্রকারে একাধিক ত্রুটি। প্রোগ্রাম "" "আব" "" -> ("আব"), প্রোগ্রাম "হ্যালোকে" "" "" "" -> (হ্যালোকে "উক্তি"), প্রোগ্রাম "" "" হ্যালো ওয়ার্ল্ড "" -> ("হ্যালো) (বিশ্ব), প্রোগ্রাম "" "হ্যালো" বিশ্ব "" -> ("হ্যালো) (বিশ্ব), প্রোগ্রাম" "" হ্যালো "বিশ্ব" "-> (" হ্যালো ওয়ার্ল্ড), প্রোগ্রাম "হ্যালো" "" বিশ্ব "" - > (হ্যালো "বিশ্ব)
থমসন

46
... কেবলমাত্র আমি বলতে পারি, উইন্ডোজ ব্যাচের ফাইলগুলির সমস্যা আছে। খ্রীষ্টের পক্ষে এটি উদ্ধৃতিগুলি রক্ষা করছে ; এটি একরকম রকেট বিজ্ঞান হওয়া উচিত নয়।
জেমস কো

4
@ জামেসকো আমি আরও একমত হতে পারি না। উইন্ডোজ কমান্ড লাইনের আরকেন অযৌক্তিকতা এবং অসঙ্গতি আমাকে ক্রোধ করতে ব্যর্থ হয়। কে এই জাঙ্ক ডিজাইন করেছে? ওহ, কয়েক ঘন্টা সময় নষ্ট! ইউনিক্স এত সহজ এবং তুলনায় অনেক বেশি অর্থবোধ করে।
কার্লোস এ। ইবাররা


24

এটা চেষ্টা কর:

myscript """test"""

প্যারামিটারে "" একককে পালাতে "।


1
এটি বেশ সঠিক নয়। চেষ্টা করুন myscript """test test"""এবং এটি কাজ করে না (প্রথম প্যারামিটারটি হস্তান্তরিত হয় "testAc আকস্মিকভাবে, আপনার তিনটি উদ্ধৃতি প্রয়োজন: myscript """"test test""শেষে তৃতীয় উদ্ধৃতিটি এড়ানো যাবে, যদিও
14: 45 এ

আমার যদি এখানে সমস্ত উদ্ধৃতি মুছে ফেলার দরকার হয় এবং নির্বাচিত ক্যোয়ারী ফিল্টারটিতে ব্যবহৃত স্ট্রিংয়ে প্যারামিটারের মানটি রাখা হয়? কেউ সাহায্য করতে পারেন?
এসএফডিসি_লিয়নার

2
এই প্রশ্নের জন্য স্পট নাও থাকতে পারে, তবে এটি যখন আমাকে char **argvআমার সি লঞ্চার থেকে অন্য প্রক্রিয়াতে spawnবা এর মতো ফাংশন ব্যবহার করে পাস করার প্রয়োজন হয়েছিল তখন আমাকে সাহায্য করেছিল exec। ধন্যবাদ. :-)
কুমারী 47

2

পিটার মর্টেনসেনের উদ্ধৃত ২ য় নথিতে কোডস্মিথের উত্তরের বিষয়ে তার মন্তব্যে আমার কাছে বিষয়গুলি আরও পরিষ্কার করা হয়েছে। সেই দস্তাবেজটি উইন্ডোজিনস্পায়ারডটকম দ্বারা লিখেছিলেন। লিঙ্কটি পুনরাবৃত্তি: উইন্ডোজ কমান্ড লাইন আর্গুমেন্টের উদ্ধৃতি এবং প্রস্থান বোঝার একটি আরও ভাল উপায়

আরও কিছু বিচার এবং ত্রুটি নিম্নলিখিত নির্দেশিকাগুলির দিকে নিয়ে যায়:

"একটি ক্যারেট দিয়ে প্রতিটি ডাবল উদ্ধৃতি এড়িয়ে চলুন ^। আপনি 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\"

ধন্যবাদ! আমি সিএমডি প্রম্পট পাঠ্যটি সিএমডি প্রম্পট পাঠ্যে প্রতিধ্বনিত করে একটি ভিসস্ক্রিপ্ট চালানোর চেষ্টা করে দেয়ালে আমার মাথাটি মারছিলাম - আমি এটি উত্তরাধিকার সূত্রে পেয়েছি - এবং উদ্ধৃতিগুলি এড়ানোর কোনও উপায় বের করতে পারি না।
পোপড্যারেন

0

আমি সেন্টিমিডি থেকে পাওয়ারশেলকে কল দিচ্ছি, এবং উদ্ধৃতিগুলি দিয়ে যাচ্ছি এবং এখানে পালানো কোনও কাজই করে নি। গুরুতর অ্যাকসেন্ট এই উইন 10 পৃষ্ঠার প্রো-তে ডাবল উদ্ধৃতিগুলি এড়াতে কাজ করেছিল।

>powershell.exe "echo la`"" >> test
>type test
la"

ডাবল উদ্ধৃতি থেকে বাঁচার জন্য অন্যান্য অক্ষরগুলির জন্য নীচে আউটপুটগুলি পেয়েছি:

la\
la^
la
la~

একটি উদ্ধৃতি এড়ানোর জন্য অন্য একটি উদ্ধৃতি ব্যবহার করার ফলে কোনও উদ্ধৃতি আসেনি। আপনি দেখতে পাচ্ছেন, অক্ষরগুলি নিজেরাই টাইপ হয়েছে তবে ডাবল উদ্ধৃতিগুলি এড়েনি।

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