ব্যাচ ফাইল শুরু / কল করার সময় আর্গুমেন্ট সংজ্ঞায়িত হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


99

আমি একটি ব্যাচ ফাইলে নিম্নলিখিত বৈধতা যুক্তি ব্যবহার করার চেষ্টা করছি তবে ব্যাচ ফাইলে কোনও প্যারামিটার সরবরাহ না করা সত্ত্বেও "ব্যবহার" ব্লক কখনই কার্যকর হয় না।

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

আমি কি ভুল করছি?



4
@ ডাবল-বিপ - আপনি যে প্রশ্নটি উল্লেখ করেছেন সে পোস্ট করার প্রায় এক বছর আগে এখানে (ড্যানিয়েল-ফোর্টুনভ দ্বারা) প্রশ্নটি প্রথম জিজ্ঞাসা করা হয়েছিল। (সম্ভাব্য) সদৃশ কোনটি?
কেভিন ফেগান

4
@ কেভিনফিগান কারণ অন্য প্রশ্নটিতে আরও দেখা এবং আরও উত্তর রয়েছে।
ডাবল-বীপ

উত্তর:


150

কমান্ডলাইন আর্গুমেন্ট সেট করা হয়েছে কিনা তা যাচাই করা যেতে পারে [%1]==[], তবে ডেভ কোস্টা উল্লেখ করেছেন যে , "%1"==""এটিও কাজ করবে।

আমি বৃহত্তর এবং কম-এর চেয়ে কম চিহ্নগুলি থেকে বাঁচতে ব্যবহারের প্রতিধ্বনিতে একটি বাক্য গঠন ত্রুটিও ঠিক করেছি। উপরন্তু, exitপ্রয়োজন একটি /Bযুক্তি অন্যথায় CMD.exeপ্রস্থান করা হবে।

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

19
[% 1] == [] "% 1" == "" এর চেয়ে ভাল কারণ এটি যেখানে% 1 নিজেই ডাবল উদ্ধৃতি রয়েছে সেই ক্ষেত্রে এটি সঠিকভাবে পরিচালনা করবে। "% 1" == "" "এই সময়ে অপ্রত্যাশিত" বার্তাটি দিয়ে ত্রুটি ঘটবে।
টেকুমারা

4
মনে রাখবেন যে, আপনি যদি কমান্ডলাইন আর্গুমেন্টগুলি কিন্তু setভেরিয়েবলগুলি ব্যবহার না করে থাকেন (আমি সঠিক ব্যাচের টার্মিনোলজিটি জানি না), আপনি ব্যবহার করতে চাইতে পারেন "%myvar%"==""কারণ যদি myvarএতে ফাঁকা স্থান থাকে এবং উদ্ধৃতি না দেওয়া হয় তবে আপনি "অপ্রত্যাশিত এই মুহূর্তে পাবেন "বার্তা।
প্যাট

4
@ পেট এসইটি ভেরিয়েবলগুলি IF NOT DEFINED VarNameব্লক দিয়ে পরীক্ষা করা যেতে পারে । তুলনায় কোট ব্যবহার না করার জন্য টুকুশানকেও +1 করুন। শুধু এটা করবেন না। কখনই না।
Fr0sT

11
"%~1"==""% 1 এর ডাবল উদ্ধৃতি রয়েছে এমন ক্ষেত্রেও কাজ করবে এবং যত্ন নেবে
ড্রাক্কিম

9
"%~1"==""[]সংস্করণটি না করে চলকগুলিতে স্পেসগুলি পরিচালনা করে।
কুকি বাটার

18

আরও উন্নত উদাহরণ:

⍟ সীমাহীন যুক্তি।

File ফাইল সিস্টেমে বিদ্যমান (হয় fileবা directory?) বা জেনেরিক string

File একটি ফাইল কিনা তা নির্দিষ্ট করুন

⍟ নির্দিষ্ট করা একটি ডিরেক্টরি

Extension কোনও এক্সটেনশন নেই, লিগ্যাসি স্ক্রিপ্টগুলিতে কাজ করবে!

সর্বনিম্ন কোড ☺

@ কেচো অফ

:লুপ
      :: -------------------------- তর্ক আছে?
      যদি ["% ~ 1"] == [""] (
        প্রতিধ্বনি সম্পন্ন
        শেষ হয়েছে
      )
      :: -------------------------- তর্ক রয়েছে?
      % ~ s1 না থাকলে (
        প্রতিধ্বনি নেই
      ) অন্য (
        প্রতিধ্বনি বিদ্যমান
        যদি% ~ s1 \ NUL উপস্থিত থাকে (
          প্রতিধ্বনি একটি ডিরেক্টরি
        ) অন্য (
          প্রতিধ্বনি একটি ফাইল
        )
      )
      :: --------------------------
      শিফট
      গোটো লুপ
      
      
:শেষ

বিরতি দিন

✨ অন্যান্য জিনিস..✨

%~1- ইন - যে ~কোনও মোড়ানো "বা সরিয়ে দেয় '

মধ্যে ■ %~s1- sপথ হবে তোলে DOS 8.3 naming, যা ফাইল-নামে এড়ানোর স্পেস একটা চমৎকার কৌতুক যখন কাপড় পরীক্ষণ (এবং এই ভাবে আরো অনেক কিছু দিয়ে সম্পদ মোড়ানো কোন প্রয়োজন নেই "সে।

["%~1"]==[""]"নিশ্চিত হতে পারে না" যদি যুক্তি, তাই পরিবর্তে অভিব্যক্তি ব্যবহার বন্ধনী এবং মূল অপরিবর্তিত একটি ফাইল / এখনো ডিরেক্টরি বা শুধু একটি জেনেরিক স্ট্রিং %1(ঠিক থাকলে "মোড়ানো, যদি থাকে ..)

যদি আমরা ব্যবহার করে থাকি shiftএবং আরগ-লিস্ট পয়েন্টারটি শেষটি কেটে যায় তবে কোনও আর্গুমেন্ট না থাকলে অভিব্যক্তিটি মূল্যায়ন করা হবে [""]==[""]

More এটি আরও নির্দিষ্ট কৌশল ব্যবহার না করে আপনি যতটা সুনির্দিষ্ট হতে পারেন (এটি উইন্ডোজ -৯৯ এর ব্যাচ-স্ক্রিপ্টগুলিতেও কাজ করবে ...)

■ কার্যকর করার উদাহরণ

এটি হিসাবে সংরক্ষণ করুন identifier.cmd

এটি সীমাহীন আর্গুমেন্টগুলি সনাক্ত করতে পারে (সাধারণত আপনি সীমাবদ্ধ থাকেন %1- %9), কেবল উল্টানো-কমা দিয়ে যুক্তিগুলি মোড়ানো বা 8.3 নামকরণ ব্যবহার করতে বা এটিকে টেনে এনে ফেলে দিন (এটি স্বয়ংক্রিয়ভাবে উপরের দুটিটি করে)।


এটি আপনাকে নিম্নলিখিত কমান্ডগুলি চালনার অনুমতি দেয়:

identifier.cmd c:\windows এবং পেতে

উপস্থিত
একটি নির্দেশিকা
সম্পন্ন

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" এবং পেতে

উপস্থিত
একটি ফাইল
সম্পন্ন

⓷ এবং একাধিক যুক্তি (অবশ্যই এটি পুরো চুক্তি ..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

এবং পেতে

উপস্থিত
একটি নির্দেশিকা
উপস্থিত
একটি ফাইল
উপস্থিত
একটি ফাইল
অস্তিত্ব নেই
সম্পন্ন.

স্বাভাবিকভাবেই এটি আরও জটিল হতে পারে তবে দুর্দান্ত উদাহরণগুলি সর্বদা সহজ এবং ন্যূনতম হওয়া উচিত। :)

আশা করি এটি কাউকে সাহায্য করবে :)

এখানে প্রকাশিত: সিএমডি নিনজা - সীমাহীন আর্গুমেন্ট প্রসেসিং, ফাইল-সিস্টেমে উপস্থিত থাকলে চিহ্নিতকরণ, ফাইল বা ডিরেক্টরি যদি সনাক্ত করা

এবং এখানে একটি কার্যকরী উদাহরণ যা কোনও পরিমাণে এপিএল ফাইল (অ্যান্ড্রয়েড অ্যাপ্লিকেশন) নেয় এবং সেগুলি ডিবাগ-কনসোলের মাধ্যমে আপনার ডিভাইসে ইনস্টল করে (ADB.exe): পূর্ববর্তী পোস্টকে একটি বৃহত এপিএল ইনস্টলার করুন যা এডিবি ইনস্টল-মাল্টি সিনট্যাক্স ব্যবহার করে না


14

বন্ধনী পরিত্রাণ পান।

নমুনা ব্যাচ ফাইল:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

উপরে স্ক্রিপ্ট চালানো থেকে আউটপুট:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

আমি মনে করি এটি স্ট্রিংগুলির অংশ হওয়ার জন্য এটি প্রথম বন্ধনীগুলি নিচ্ছে এবং তাদের তুলনা করা হচ্ছে।


4
if "%1"==""আরগের ফাঁকা স্থান থাকলে ক্রাশ হবে। উদাহরণস্বরূপ: run.bat "a b"। @ আমর এর ব্যবহারের সর্বোত্তম উত্তর রয়েছেif "%~1"==""
উইসবাকি

6
IF "%~1"=="" GOTO :Usage

যদি% 1 নিজেই উদ্ধৃত হয় তবে% 1 ডি-কোট হবে।

"" পাস করা বিশেষ অক্ষর থেকে রক্ষা করবে। উদাহরণস্বরূপ & পিং সহ স্ক্রিপ্ট কল করা


4
এটি সেরা উত্তর। অন্যান্য উত্তরগুলি কিছু ক্ষেত্রে কাজ করে তবে আরও বিশেষ ক্ষেত্রে যেমন ব্যর্থ হবেrun.bat "a b"
উইসবাকী

@ উইসবাকী এটি গ্রহণ করা উত্তরকে বিশৃঙ্খলা করবে বলে মনে হচ্ছে না । আমি কী মিস করছি?
ruffin

@ আরফিন, উদাহরণ: run.bat ""ধরা পড়বে না [%1]==[]
উইসবুকি


2

এটি অন্যান্য জবাবগুলির মতো একই, তবে কেবলমাত্র একটি লেবেল ব্যবহার করে এবং প্রথমে ব্যবহারটি রাখে যা অতিরিক্তভাবে এটি স্ক্রিপ্টের এক ধরণের ডকুমেন্টেশন প্রশংসন হিসাবে কাজ করে যা সাধারণত উপরে থাকে:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

তবে, যদি আপনাকে সিএমডি / ব্যাচ ব্যবহার না করতে হয়, ডাব্লুএসএল বা পাওয়ারশেলগুলিতে ব্যাশ ব্যবহার করুন, তাদের আরও বুদ্ধিমান সিনট্যাক্স এবং কম আরকেন বৈশিষ্ট্য রয়েছে।


0

যদি "% 1" == "" ব্যর্থ হয় তবে এর সমস্ত সংস্করণ নির্দিষ্ট বিষ অক্ষরের শর্তে ব্যর্থ হবে। কেবলমাত্র যদি সংজ্ঞায়িত হয় বা সংজ্ঞা না থাকে তবে নিরাপদ থাকে


if [not] defined ...মত পরামিতি সঙ্গে কাজ করে না %1। আপনার কি উদাহরণ আছে, কোথায় if "%~1" ...কাজ হয় না?
স্টিফান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.