".Bat" ফাইলটিতে কমান্ড লাইন প্যারামিটার কীভাবে চেক করবেন?


104

আমার ওএস হ'ল উইন্ডোজ ভিস্তা। আমার কাছে একটি ".bat" ফাইল থাকা দরকার যেখানে ব্যবহারকারী কোনও কমান্ড-লাইন প্যারামিটারে প্রবেশ করেছে কিনা তা আমার পরীক্ষা করা দরকার। যদি তা হয় তবে যদি প্যারামিটারের সমান হয় -bতবে আমি কিছু করব অন্যথায় আমি "অবৈধ ইনপুট" পতাকাঙ্কিত করব। যদি ব্যবহারকারী কোনও কমান্ড-লাইন প্যারামিটার প্রবেশ না করে তবে আমি কিছু করব। আমি নিম্নলিখিত .bat ফাইল তৈরি করেছি। এটি ক্ষেত্রে -bএবং না-সমান -bক্ষেত্রে কাজ করে - তবে এটি ব্যর্থ হয় যখন ব্যবহারকারী কোনও কমান্ড-লাইন প্যারামিটারটি পাস না করে।

আমি সর্বদা ত্রুটি পাই:

GOTO was unexpected at this time.

কেউ কি আমাকে বলতে পারে যে আমি এখানে কী ভুল করছি?


ECHO OFF
CLS
ECHO.

IF [%1]==[/?] GOTO BLANK

IF %1=="-b" GOTO SPECIFIC

IF NOT %1=="-b" GOTO UNKNOWN

:SPECIFIC

ECHO SPECIFIC

GOTO DONE

:BLANK

ECHO No Parameter

GOTO DONE

:UNKNOWN

ECHO Unknown Option

GOTO DONE

:DONE

ECHO Done!

আপনি যদি GOTO BLANKঅন্য দুটি IFবিবৃতিতে বন্ধনী ( লাইনের মতো) যুক্ত করেন, তবে সমস্যাটি কি ঠিক হবে?
যেরেমিয়া উইলকক

উত্তর:


141

প্যারামিটারটি ফাঁকা থাকার জন্য আপনাকে পরীক্ষা করতে হবে: if "%~1"=="" goto blank

একবার আপনি এটি করেন, তারপরে একটি / অন্যথায় স্যুইচ করুন-বি: if "%~1"=="-b" (goto specific) else goto unknown

উদ্ধৃতি সহ পরামিতিগুলির চারপাশ খালি / ফাঁকা / অনুপস্থিত পরামিতিগুলির মতো জিনিসগুলি চেক করা সহজ করে। "~" নিশ্চিত করে যে ডাবল উদ্ধৃতিগুলি কমান্ড লাইনের যুক্তিতে থাকলে তা ছড়িয়ে দেওয়া হয়।


এইটা কাজ করে!! কেবল "অন্য" গ্রহণযোগ্য নয়। আমি ত্রুটি পেয়েছি: 'অন্যথায়' একটি অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়। সুতরাং আমি "বি-সমান না" মামলার জন্য আর একটি আইএফ যুক্ত করেছি। দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ।
javauser71

7
অন্যথায় যদি যেমন একই লাইনে থাকতে হবে, অথবা এটি একটি বন্ধনী পরে সরাসরি হতে হয়েছে
Jeb

4
এটি% 1 এর মধ্যে ফাঁকা স্থান থাকলে এটি আমার পক্ষে কাজ করবে বলে মনে হয় না, যদি এটি কার্যকর করার যোগ্য পুরো পথ হয়। এমন কোনও সমাধানের জন্য যেরেমিয়া উইলককের উত্তর দেখুন যা তাদের মানগুলিতে শূন্যস্থান সহ পরামিতিগুলির জন্যও কাজ করে।
মার্ক এ।

এটি যদি আপনার যুক্তি একটি হয় তবে তা গ্রহণ করা হবে না, সেক্ষেত্রে আপনার Fileকেবলমাত্র পরীক্ষা করা উচিত existবা not exist। এ কারণেই আপনার যুক্তিগুলি ভালভাবে সংজ্ঞায়িত করা উচিত, বা কেবল পাওয়ারশেল বা ভিবিস্ক্রিপ্ট ব্যবহার করুন (আপনি যদি 80 এর দশকের মধ্যে থাকেন ..)

4
এটি জন্য ব্যর্থ run.bat "a b""%1"==""আরগের একটি জায়গা থাকলে ক্রাশ হয়। দেখুন stackoverflow.com/a/46942471
wisbucky

27

একটি উত্তরের জন্য http://ss64.com/nt/if.html দেখুন ; কমান্ডটি IF [%1]==[] GOTO NO_ARGUMENTঅনুরূপ বা অনুরূপ।


4
শুধু এই ALSO কাজ করে না! এটি ঠিক বিপরীতে কাজ করে "%1"==""। আমার নিজের উত্তরে সে সম্পর্কে বিস্তারিত জানাতে হবে।
টমাসজ গ্যান্ডার

4
% 1 উদ্ধৃত করা হয়, যেমন এটি বিরতি হবে যেমন foo.bat "1st parameter" 2nd_param। দেখুন stackoverflow.com/questions/2541767/...
অনুজ্জ্বল উইলকি

[%1]==[-b]আরগ উদ্ধৃত হলে ব্যবহার করা মিলবে না। উদাহরণ run.bat "-b"। দেখুন stackoverflow.com/a/46942471
wisbucky

20

সংক্ষিপ্ত উত্তর - বর্গাকার বন্ধনী ব্যবহার করুন:

if [%1]==[] goto :blank

বা (যখন আপনার উদ্ধৃত আরোগুলি পরিচালনা করতে হবে, নীচের সম্পাদনাটি দেখুন):

if [%~1]==[] goto :blank

কেন? আপনি জিজ্ঞাসা করতে পারেন। ঠিক আছে, ঠিক যেমন যেরেমি উইলকক উল্লেখ করেছেন: http://ss64.com/nt/if.html - তারা এটি ব্যবহার করে! ঠিক আছে, তবে উদ্ধৃতিগুলির সাথে কী হয়েছে?

আবার, সংক্ষিপ্ত উত্তর: এগুলি "যাদুকর" - কখনও কখনও দ্বিগুণ (ডাবল) উদ্ধৃতিগুলি একটি একক (ডাবল) উদ্ধৃতিতে রূপান্তরিত হয়। এবং তাদের প্রথম ম্যাচ করা দরকার a

এই ছোট স্ক্রিপ্ট বিবেচনা করুন:

@rem argq.bat
@echo off

:loop 
if "%1"=="" goto :done
echo %1
shift
goto :loop

:done
echo Done.

আসুন এটি পরীক্ষা করুন:

C:\> argq bla bla
bla
bla
Done.

কাজ মনে হচ্ছে। তবে এখন, দ্বিতীয় গিয়ারে স্যুইচ করা যাক:

C:\> argq "bla bla"
bla""=="" was unexpected at this time.

বুম এটি সত্যকে মূল্যায়ন করেনি, এটি মিথ্যাও বলেও মূল্যায়ন করেনি। স্ক্রিপ্ট ডিআইডি হয়েছে। আপনি যদি লাইনের কোথাও চুল্লিটি বন্ধ করার কথা বলছিলেন তবে ভাল - শক্ত ভাগ্য। আপনি এখন হ্যারি ডাগলিয়ানের মতো মারা যাবেন।

আপনি ভাবতে পারেন - ঠিক আছে, যুক্তিগুলিতে উদ্ধৃতি থাকতে পারে না। তারা যদি করে তবে এটি ঘটে। ভুল এখানে কিছু সান্ত্বনা দেওয়া হয়েছে:

C:\> argq ""bla bla""
""bla
bla""
Done.

ও আচ্ছা. চিন্তা করবেন না - কখনও কখনও এটি কাজ করবে

আসুন অন্য স্ক্রিপ্ট চেষ্টা করুন:

@rem args.bat
@echo off

:loop 
if [%1]==[] goto :done
echo %1
shift
goto :loop

:done
echo Done.

আপনি নিজে পরীক্ষা করতে পারেন, এটি উপরের কেসগুলির জন্য ঠিক আছে। এটি যৌক্তিক - উদ্ধৃতিগুলির বন্ধনীগুলির সাথে কিছু করার নেই, সুতরাং এখানে কোনও জাদু নেই। কিন্তু বন্ধনীর সাহায্যে আরগগুলি স্পাইসিংয়ের কী হবে?

D:\>args ]bla bla[
]bla
bla[
Done.

D:\>args [bla bla]
[bla
bla]
Done.

ভাগ্য নেই সেখানে। বন্ধনীগুলি কেবলমাত্র cmd.exeপার্সারকে শ্বাসরোধ করতে পারে না ।

আসুন এক মুহুর্তের জন্য দুষ্ট উদ্ধৃতিগুলিতে ফিরে যাই। সমস্যাটি ছিল, যখন একটি উদ্ধৃতি দিয়ে যুক্তিটি শেষ হয়েছিল:

D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.

আমি যদি পাস করি তবে:

D:\>argq bla2"
The syntax of the command is incorrect.

স্ক্রিপ্টটি মোটেও চলবে না। একই জন্য args.bat:

D:\>args bla2"
The syntax of the command is incorrect.

তবে আমি কী পাব, যখন এই জাতীয় ক্ষেত্রে- "পাঠকদের সংখ্যা "ম্যাচ" হয় (যেমন - সম হয়):

D:\>args bla2" "bla3
bla2" "bla3
Done.

নিস - আমি আশা করি যে .batফাইলগুলি তাদের কমান্ড লাইন আর্গুমেন্টগুলিকে কীভাবে বিভক্ত করে সে সম্পর্কে কিছু শিখেছে (ইঙ্গিত: * এটি ঠিক তেমন পছন্দ নয়)। উপরের যুক্তিতে একটি স্থান রয়েছে। তবে উদ্ধৃতিগুলি স্বয়ংক্রিয়ভাবে ছিনিয়ে নেওয়া হয় না।

আর আর্গকি? এটি কীভাবে প্রতিক্রিয়া জানায়? পূর্বাভাস:

D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.

সুতরাং - আপনি বলার আগে ভাবেন: "কী জানেন? শুধু উদ্ধৃতি ব্যবহার করুন। [কারণ, আমার কাছে এটি দেখতে সুন্দর লাগে]"।

সম্পাদনা করুন

সম্প্রতি, এই উত্তর সম্পর্কে মন্তব্য ছিল - ভাল, স্কয়ার ব্র্যাকেটগুলি "পরিচালনা করতে পারে না" উদ্ধৃত যুক্তিগুলি পাস করা এবং তাদের সাথে এমনভাবে আচরণ করা যেমন তাদের উদ্ধৃত হয়নি।

বাক্য গঠন:

if "%~1"=="" (...)

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

এই "প্রযুক্তি" বর্গাকার বন্ধনীগুলির পাশাপাশি কাজ করে:

if [%~1]==[] (...)

এটি উল্লেখ করা একটি দরকারী জিনিস ছিল, তাই আমি নতুন উত্তরটিকেও উজ্জীবিত করেছি।

শেষ পর্যন্ত, ডাবল উক্তি ভক্তরা, ফর্মের একটি যুক্তি ""আপনার বইতে উপস্থিত আছে, বা এটি ফাঁকা? শুধু জিজ্ঞাসা করুন ';)


4
[%1]==[-b]আরগের মতো উদ্ধৃতি দেওয়া থাকলে স্কোয়ার বন্ধনী মিলবে না run.bat "-b"। দেখুন stackoverflow.com/a/46942471
wisbucky

ঐতিহাসিকভাবে নোট: [%1]==[-b]এবং "%1"=="-b"জয় 98 এবং তার আগে এমএস / পিসি ডস সিস্টেম ব্যাচ স্ক্রিপ্ট জন্য একই ছিল। যেহেতু জয় 2000 / এনটি সিন্ট্যাক্স প্রবর্তন করেছে if "%~1"=="-b"যেখানে ডাবল উদ্ধৃতিগুলির বিশেষ অর্থ রয়েছে যা আপনাকে স্ক্রিপ্টগুলি কোড করা উচিত কারণ এটি আরও দৃ protection় সুরক্ষা সরবরাহ করে। ডাবল উদ্ধৃতিগুলি বিশেষ অক্ষরের অর্থ থেকে রক্ষা পায় (চেষ্টা করুন & | এবং আপনার কমান্ড লাইনের% অক্ষর)। উদাহরণস্বরূপ 99.9% ডাবল কোট বাক্য গঠন নিয়ে কাজ করে - আপনার উদাহরণটি argq bla2" "bla3কেবল বর্গাকার বন্ধনীকে ন্যায়সঙ্গত করার ক্ষেত্রে। এমবেডেড উদ্ধৃতি চিহ্ন দুর্যোগ জন্য একটি রেসিপি হয় - শুধু Sayin '
এড়িয়ে আর

@ স্কিপিআর - এজন্য উইন্ডোজের ফাইল সিস্টেমে আপনার বিশেষ নামগুলি থাকতে পারে না। আমার গাণিতিক প্রমাণ নেই, তবে আমি মনে করি যে cmdশেলটিতে কেবল সমস্ত কিছু উদ্ধৃত করা যায় না (কিছুটা পালানোর ক্রম ইত্যাদির মাধ্যমে তৈরি ভারব্যাটিয়ামের অর্থে) । অন্যান্য সিস্টেমে আপনি কখনও কখনও সমস্ত কিছু উদ্ধৃত করতে পারেন, NUL অক্ষর অন্তর্ভুক্ত। ( stackoverflow.com/questions/2730732/… ) - এই প্রশ্নটি কেবল দেখায়, আপনাকে কিছু বাহ্যিক প্রোগ্রাম ব্যবহার করা দরকার।
টমসজ গ্যান্ডর 21

8

আমি সাবস্ক্রাইব করা অন্যান্য উত্তরগুলির পাশাপাশি, আপনি কমান্ডটির /Iস্যুইচ ব্যবহার করে বিবেচনা করতে পারেন IF

... / আমি স্যুইচ, যদি নির্দিষ্ট করা হয়, ক্ষেত্রে সংবেদনশীল স্ট্রিং তুলনা করতে বলে।

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

IF /I "%1"=="-b" GOTO SPECIFIC

6

আপনি স্ট্রিং তুলনা করছেন। যদি একটি আর্গুমেন্ট বাদ দেওয়া হয়, %1একটি ফাঁকাতে প্রসারিত হয় যাতে কমান্ডগুলি IF =="-b" GOTO SPECIFICউদাহরণস্বরূপ হয় (যা একটি সিনট্যাক্স ত্রুটি)। আপনার স্ট্রিংগুলি কোটে (বা বর্গাকার বন্ধনীতে) মোড়ানো।

REM this is ok
IF [%1]==[/?] GOTO BLANK

REM I'd recommend using quotes exclusively
IF "%1"=="-b" GOTO SPECIFIC

IF NOT "%1"=="-b" GOTO UNKNOWN

যদি [% 1] == [/?] কাজ করছে না তবে আমি যদি [% 1] == [] বা "% 1" == "" কাজ করি তবে তা কার্যকর হয়। যাইহোক এখন আমি যেতে পারেন। দ্রুত সাড়া দেওয়ার জন্য আপনাকে ধন্যবাদ।
javauser71

5

আসলে, অন্যান্য সমস্ত উত্তরের ত্রুটি রয়েছে। সবচেয়ে নির্ভরযোগ্য উপায় হ'ল:

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

বিস্তারিত ব্যাখ্যা:

"%1"=="-b"স্পেস এবং কোট দিয়ে যুক্তি পাস করলে ক্র্যাশ হয়ে যাবে Using এটি সর্বনিম্ন নির্ভরযোগ্য পদ্ধতি।

IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat "a b"

b""=="-b" was unexpected at this time.

ব্যবহার [%1]==[-b]করা আরও ভাল কারণ এটি শূন্যস্থান এবং উদ্ধৃতিগুলির সাথে ক্র্যাশ হবে না, তবে যুক্তিটি উদ্ধৃতি দ্বারা ঘিরে থাকলে এটি মিলবে না।

IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat "-b"

(does not match, and jumps to UNKNOWN instead of SPECIFIC)

ব্যবহার "%~1"=="-b"সবচেয়ে নির্ভরযোগ্য। %~1আশেপাশের উক্তি উপস্থিত থাকলে তা ছিনিয়ে নেবে। সুতরাং এটি কোনও উদ্ধৃতি সহ এবং ছাড়াই এবং কোনও আর্গুমেন্ট ছাড়াই কাজ করে।

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat
C:\> run.bat -b
C:\> run.bat "-b"
C:\> run.bat "a b"

(all of the above tests work correctly)

4
এটি স্কোয়ার বন্ধনীগুলির শেষ নয়, আপনি দেখুন: IF [%~1]==[]- এটি কাজ করে এবং এটি পরিচালনাও করে "-b"। আপনি শুধু চিন্তা করতে সক্ষম হতে হবে ভিতরে বাক্স, ERM, বর্গাকার [বন্ধনী]।
টমাসজ গ্যান্ডার 21

3

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

"%1"=="-?" প্যারামিটারটি উদ্ধৃতিতে আবদ্ধ থাকলে (ফাইলের নাম ইত্যাদির জন্য প্রয়োজনীয়) মিলবে না বা প্যারামিটারটি উদ্ধৃতিতে রয়েছে এবং ফাঁকা স্থান রয়েছে (আবার প্রায়শই ফাইলের নামে দেখা যাবে)

@ECHO OFF
SETLOCAL
echo.
echo starting parameter test...
echo.
rem echo First parameter is %1
if "%1"=="-?" (echo Condition is true, param=%1) else (echo Condition is false, param=%1)
C:\>test.bat -?

starting parameter test...

Condition is true, param=-?

C:\>test.bat "-?"

starting parameter test...

Condition is false, param="-?"

বর্গাকার বন্ধনীগুলির সাথে যে কোনও সংমিশ্রণ [%1]==[-?]বা [%~1]==[-?]প্যারামিটারের উদ্ধৃতিগুলির মধ্যে স্পেস থাকলে ক্ষেত্রে ব্যর্থ হবে:

@ECHO OFF
SETLOCAL 
echo.
echo starting parameter test...
echo.
echo First parameter is %1
if [%~1]==[-?] (echo Condition is true, param=%1) else (echo Condition is false, param=%1)

C:\>test.bat "long file name"

starting parameter test...

First parameter is "long file name"
file was unexpected at this time.

প্রস্তাবিত সুরক্ষিত সমাধানটি "%~1"=="-?"একটি জটিল প্যারামিটারের সাথে ক্র্যাশ হবে যাতে উদ্ধৃতিগুলির বাইরে টেক্সট এবং উদ্ধৃতিগুলির মধ্যে ফাঁকা স্থান সহ পাঠ্য থাকবে:

@ECHO OFF
SETLOCAL 
echo.
echo starting parameter test...
echo.
echo First parameter is %1
if "%~1"=="-?" (echo Condition is true, param=%1) else (echo Condition is false, param=%1)

C:\>test.bat -source:"long file name"

starting parameter test...

First parameter is -source:"long file name"
file was unexpected at this time.

উপরের সমস্ত পরিস্থিতিগুলি আচ্ছাদিত রয়েছে তা নিশ্চিত করার একমাত্র উপায় হ'ল সক্ষমডেলিডএক্স্পেনশন ব্যবহার করা এবং ভেরিয়েবলগুলি ব্যবহার করে রেফারেন্স দ্বারা (মান দ্বারা নয়) পরামিতিগুলি পাস করা। তারপরেও সবচেয়ে জটিল পরিস্থিতিটি দুর্দান্ত কাজ করবে:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
echo.
echo starting parameter test...
echo.
echo First parameter is %1
:: we assign the parameter to a variable to pass by reference with delayed expansion
set "var1=%~1"
echo var1 is !var1!
:: we assign the value to compare with to a second variable to pass by reference with delayed expansion
set "var2=-source:"c:\app images"\image.png"
echo var2 is !var2!
if "!var1!"=="!var2!" (echo Condition is true, param=!var1!) else (echo Condition is false, param=!var1!)
C:\>test.bat -source:"c:\app images"\image.png

starting parameter test...

First parameter is -source:"c:\app images"\image.png
var1 is -source:"c:\app images"\image.png
var2 is -source:"c:\app images"\image.png
Condition is true, param=-source:"c:\app images"\image.png

C:\>test.bat -source:"c:\app images"\image1.png

starting parameter test...

First parameter is -source:"c:\app images"\image1.png
var1 is -source:"c:\app images"\image1.png
var2 is -source:"c:\app images"\image.png
Condition is false, param=-source:"c:\app images"\image1.png

C:\>test.bat -source:"c:\app images\image.png"

starting parameter test...

First parameter is -source:"c:\app images\image.png"
var1 is -source:"c:\app images\image.png"
var2 is -source:"c:\app images"\image.png
Condition is false, param=-source:"c:\app images\image.png"

0

উইন্ডোজ ব্যাচে এটি করার জন্য সংজ্ঞায়িত কীওয়ার্ড রয়েছে।

IF DEFINED %~1 foo
IF NOT DEFINED %~1 bar

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