উইন্ডোজ ব্যাট ফাইল alচ্ছিক যুক্তি পার্সিং


84

একাধিক namedচ্ছিক নাম যুক্তি গ্রহণ করতে আমার ব্যাট ফাইলটি দরকার need

mycmd.bat man1 man2 -username alice -otheroption

উদাহরণস্বরূপ, আমার কমান্ডে 2 টি বাধ্যতামূলক প্যারামিটার রয়েছে এবং দুটি বিকল্প paraষধ প্যারামিটার (-ব্যবহারকারীর নাম) যা এলিসের আর্গুমেন্ট মান এবং -অর্থোপশন রয়েছে:

আমি এই মানগুলি ভেরিয়েবলগুলিতে ফেলতে সক্ষম হতে চাই।

ইতিমধ্যে এটি সমাধান করে এমন যে কাউকে একটি কল করা। ম্যান এই ব্যাট ফাইলগুলি একটি ব্যথা।


12
কোনও বিএটি ফাইলে এটি করতে এবং ভিবিএস স্ক্রিপ্টে না বলার কোনও কারণ আছে? এটি একটি BAT ফাইলে করার একটি উপায় থাকতে পারে তবে BAT ফাইলের পদ্ধতির সাথে লেগে থাকা, আপনি "আপনি একটি বেদনার জগতে প্রবেশ করছেন পুত্র"। :-)
আলেক ডেভিস

পাওয়ারশেল ব্যবহার করা আরও ভাল। এটিতে অত্যন্ত উন্নত এবং অন্তর্নির্মিত প্যারামিটার পরিচালনা রয়েছে।
বিল_সেটওয়ার্ট

4
@ অ্যালেকডাভিস, আপনি সম্ভবত সঠিক, তবে আমি অত্যন্ত ভিবিএস স্ক্রিপ্ট-ফোবিক। আমি যদি কখনও নিজেকে ভিবিএস স্ক্রিপ্ট ব্যবহার করতে পাই তবে আমি মনে করি আমি ইতিমধ্যে বেদনার জগতে রয়েছি। আমি আনন্দের সাথে নিজেকে কিছু ব্যাচ ফাইল লিখব, তবে যদি আমি এটি মানুষের পক্ষে আরও কার্যকর করতে চাই তবে আমি কিছু যুক্তি যুক্ত করব। প্রায়শই এর মধ্যে কিছু alচ্ছিক। আমি ব্যাংকিংয়ের জগৎ ছেড়ে চলে আসার পরে কোনও মুহুর্তেই আমি ভেবে দেখেছি বা কেউ পরামর্শ দিয়েছেন "আপনি এর জন্য কিছু ভিবিএস স্ক্রিপ্ট চাইবেন"।
icc97

@ চিকেনিনাবিস্কুট: লিঙ্কটি আর কাজ করে না। ওয়েব্যাক মেশিন সংস্করণটি করে। আমি আপনার মন্তব্য সম্পাদন করলে যেন আমি কাজ করেনি বা না আমি এটা এখানে পরিবর্তে পেস্ট করা যাচ্ছে না এটা দেখুন পরিবর্তন করতে হবে জানি না: http://web.archive.org/web/20090403050231/http://www.pcguide.com/vb/showthread.php?t=52323
ব্রেন্ট রাইটেনহাউস

উত্তর:


113

যদিও আমি @ আলেকড্যাভিস'র মন্তব্যের সাথে একমত হতে চাইছি তবে এনটি শেলের মধ্যে এটি করার বিভিন্ন উপায় রয়েছে।

আমি শিফট কমান্ড এবং আই শর্তসাপেক্ষ শাখা গ্রহণের সুবিধাটি গ্রহণ করব , এরকম কিছু ...

@ECHO OFF

SET man1=%1
SET man2=%2
SHIFT & SHIFT

:loop
IF NOT "%1"=="" (
    IF "%1"=="-username" (
        SET user=%2
        SHIFT
    )
    IF "%1"=="-otheroption" (
        SET other=%2
        SHIFT
    )
    SHIFT
    GOTO :loop
)

ECHO Man1 = %man1%
ECHO Man2 = %man2%
ECHO Username = %user%
ECHO Other option = %other%

REM ...do stuff here...

:theend

4
SHIFT /2শিফটগুলি আরগ 2 থেকে শুরু হয় two এটি দিয়ে প্রতিস্থাপন করা উচিত নয় SHIFT & SHIFT?
dbenham

4
ঠিক আছে - আমি কেন কোডটি সাধারণত কাজ করে তা দেখি - লুপের SHIFT অবশেষে বিকল্পগুলি আরগ 1 এ সরিয়ে দেয় এবং কোনও ক্ষতি হয় না (সাধারণত)। তবে প্রাথমিক SHIFT / 2 অবশ্যই একটি বাগ যা ফলাফলকে দূষিত করবে যদি 1 টি বিকল্পের নামের সাথে মেলে এমন 1 মান হয়। চালানোর চেষ্টা করুন mycmd.bat -username anyvalue -username myName -otheroption othervalue। ফলাফলটি ব্যবহারকারী = আমার নাম, অন্যান্য = অন্যান্য মূল্যবান হওয়া উচিত; তবে কোডটি ব্যবহারকারীকে =-ব্যবহারকারীর নাম, অন্যান্য = অন্যান্য মূল্য দেয়। বাগটি প্রতিস্থাপনের SHIFT /2মাধ্যমে স্থির করা হয়েছে SHIFT & SHIFT
dbenham

4
@ ক্রিশ্চিয়ান - ইওল সম্পর্কে ভুল ;- এটি এর জায়গায় ব্যবহার করা যাবে না &
dbenham

4
এটি দুর্দান্ত শুরু, তবে আমি 3 টি সমস্যা দেখতে পাচ্ছি। প্রথম: ক) 10 লাইন পরে, %1এবং %2"ব্যবহৃত" হয়েছে। খ) একক SHIFTলাইনের 11 টি %2নীচে 1 অবস্থানের মান সরিয়ে দেয় এবং তারপরে (আবার) উপলভ্য হয় %1এবং "অব্যবহৃত" মানটি %3হিসাবে উপলব্ধ %2। গ) IF13 লাইনে থাকা ইতিমধ্যে এটি "ব্যবহৃত" মানটি দেখে %2যা থেকে এখন %1। d) 10 লাইন থেকে "ব্যবহারকারীর নাম" যদি মনে হয় তবে "-otheroption"এটি আবার ব্যবহার করা otherহবে এবং নতুন মানতে সেট করা হবে %2যা সম্ভবত পরবর্তী বিকল্পের নাম ছিল। --->
কেভিন ফেগান

4
২ য় সমস্যা: ওপি প্রশ্নের ক্ষেত্রে, -otheroptionকোনও মান অনুসরণ করা হয়নি, সুতরাং এটি সম্ভবত কোনও -Flagটাইপ বিকল্প হিসাবে বোঝানো হয়েছিল এবং এটি দ্বিতীয় তর্কটি গ্রহন করা উচিত নয়। তৃতীয়: যদি আর্গুমেন্টটি %1অভ্যন্তরীণ IFবিবৃতিগুলি দ্বারা পরিচালনা না করা হয় , তবে এটি চুপচাপ উপেক্ষা করা হবে। কোডটি সম্ভবত কোনও বার্তা প্রদর্শন করবে যা ইঙ্গিত করে যে এটি কোনও বৈধ বিকল্প নয়। অভ্যন্তরীণ বিবৃতিগুলিতে প্রয়োজনীয় SHIFTএবং GOTO :loopবিবৃতি যুক্ত করে IFবা একটি ELSEবিবৃতি যুক্ত করে এটি করা যেতে পারে ।
কেভিন ফেগান

75

নির্বাচিত উত্তরটি কাজ করে তবে এটি কিছু উন্নতি করতে পারে।

  • বিকল্পগুলি সম্ভবত ডিফল্ট মানগুলিতে শুরু করা উচিত।
  • এটি প্রয়োজনীয়% টি% 1 এবং% 2 এর পাশাপাশি% 0 সংরক্ষণ করে রাখা ভাল।
  • প্রতিটি বিকল্পের জন্য আইএফ ব্লক থাকা ব্যথা হয়ে যায়, বিশেষত বিকল্পগুলির সংখ্যা বাড়ার সাথে সাথে।
  • সমস্ত বিকল্প এবং ডিফল্টকে এক জায়গায় দ্রুত সংজ্ঞায়িত করার জন্য একটি সহজ এবং সংক্ষিপ্ত উপায় থাকা ভাল হবে।
  • পতাকা হিসাবে কাজ করে এমন একা একা বিকল্পগুলি সমর্থন করা ভাল (বিকল্পটি অনুসরণ করে কোনও মূল্য নেই)।
  • কোনও আর্গ উদ্ধৃতিতে আবদ্ধ আছে কিনা তা আমরা জানি না। তবুও আমরা জানি না পালানো অক্ষর ব্যবহার করে কোনও আরগ মান পাস করা হয়েছে কিনা। % ~ 1 ব্যবহার করে একটি আরগ অ্যাক্সেস করা ভাল এবং উদ্ধৃতিগুলির মধ্যে অ্যাসাইনমেন্টটি বন্ধ করে দেওয়া। তারপরে ব্যাচটি এনকোলেসিং কোটগুলির অভাবে নির্ভর করতে পারে তবে বিশেষ অক্ষরগুলি এখনও এড়িয়ে চলা ছাড়া নিরাপদে থাকে। (এটি বুলেট প্রমাণ নয়, তবে এটি বেশিরভাগ পরিস্থিতিতে পরিচালনা করে)

আমার সমাধান একটি বিকল্প বিকল্প পরিবর্তনশীল তৈরির উপর নির্ভর করে যা সমস্ত বিকল্প এবং তাদের ডিফল্টকে সংজ্ঞায়িত করে। সরবরাহকৃত বিকল্পটি বৈধ কিনা তা পরীক্ষা করার জন্য বিকল্পগুলিও ব্যবহৃত হয়। বিকল্প হিসাবে একই নামে ভেরিয়েবলের বিকল্প মানগুলি সংরক্ষণ করে প্রচুর পরিমাণে কোড সংরক্ষণ করা হয়। কোডের পরিমাণটি কতগুলি বিকল্পের সংজ্ঞায়িত নির্বিশেষে স্থির থাকে; কেবল বিকল্পগুলির সংজ্ঞা পরিবর্তন করতে হবে।

সম্পাদনা - এছাড়াও, বাধ্যতামূলক অবস্থানগত আর্গুমেন্টের সংখ্যা পরিবর্তন হলে লুপ কোড অবশ্যই পরিবর্তন করতে হবে। উদাহরণস্বরূপ, প্রায়শই সমস্ত আর্গুমেন্টের নাম দেওয়া হয়, সেই ক্ষেত্রে আপনি 3 এর পরিবর্তে 1 পয়েন্টে শুরু করে যুক্তিগুলি পার্স করতে চান তাই লুপের মধ্যে, সমস্ত 3 টি 1 হয়ে যায় এবং 4 টি 2 হয়ে যায়।

@echo off
setlocal enableDelayedExpansion

:: Define the option names along with default values, using a <space>
:: delimiter between options. I'm using some generic option names, but 
:: normally each option would have a meaningful name.
::
:: Each option has the format -name:[default]
::
:: The option names are NOT case sensitive.
::
:: Options that have a default value expect the subsequent command line
:: argument to contain the value. If the option is not provided then the
:: option is set to the default. If the default contains spaces, contains
:: special characters, or starts with a colon, then it should be enclosed
:: within double quotes. The default can be undefined by specifying the
:: default as empty quotes "".
:: NOTE - defaults cannot contain * or ? with this solution.
::
:: Options that are specified without any default value are simply flags
:: that are either defined or undefined. All flags start out undefined by
:: default and become defined if the option is supplied.
::
:: The order of the definitions is not important.
::
set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"

:: Set the default option values
for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"

:loop
:: Validate and store the options, one at a time, using a loop.
:: Options start at arg 3 in this example. Each SHIFT is done starting at
:: the first option so required args are preserved.
::
if not "%~3"=="" (
  set "test=!options:*%~3:=! "
  if "!test!"=="!options! " (
    rem No substitution was made so this is an invalid option.
    rem Error handling goes here.
    rem I will simply echo an error message.
    echo Error: Invalid option %~3
  ) else if "!test:~0,1!"==" " (
    rem Set the flag option using the option name.
    rem The value doesn't matter, it just needs to be defined.
    set "%~3=1"
  ) else (
    rem Set the option value using the option as the name.
    rem and the next arg as the value
    set "%~3=%~4"
    shift /3
  )
  shift /3
  goto :loop
)

:: Now all supplied options are stored in variables whose names are the
:: option names. Missing options have the default value, or are undefined if
:: there is no default.
:: The required args are still available in %1 and %2 (and %0 is also preserved)
:: For this example I will simply echo all the option values,
:: assuming any variable starting with - is an option.
::
set -

:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!

সত্যিই তেমন কোড নেই। উপরের কোডটির বেশিরভাগই মন্তব্য। এখানে ঠিক একই কোড, মন্তব্য ছাড়াই।

@echo off
setlocal enableDelayedExpansion

set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"

for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
if not "%~3"=="" (
  set "test=!options:*%~3:=! "
  if "!test!"=="!options! " (
      echo Error: Invalid option %~3
  ) else if "!test:~0,1!"==" " (
      set "%~3=1"
  ) else (
      set "%~3=%~4"
      shift /3
  )
  shift /3
  goto :loop
)
set -

:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!


এই সমাধানটি উইন্ডোজ ব্যাচের মধ্যে ইউনিক্স শৈলী আর্গুমেন্ট সরবরাহ করে। এটি উইন্ডোজের আদর্শ নয় - ব্যাচে সাধারণত প্রয়োজনীয় যুক্তিগুলির পূর্ববর্তী বিকল্প থাকে এবং বিকল্পগুলি উপসর্গযুক্ত থাকে /

এই সমাধানটিতে ব্যবহৃত কৌশলগুলি উইন্ডোজ স্টাইলের বিকল্পগুলির জন্য সহজেই মানিয়ে নেওয়া হয়।

  • পার্সিং লুপ সর্বদা একটি বিকল্পের সন্ধান করে %1এবং আরগ 1 শুরু না হওয়া অবধি এটি চলতে থাকে/
  • নোট করুন যে নামটি শুরু হলে SET অ্যাসাইনমেন্টগুলি উদ্ধৃতিগুলির মধ্যে অবশ্যই আবদ্ধ থাকতে হবে /
    SET /VAR=VALUEব্যর্থ
    SET "/VAR=VALUE"কাজ। আমি ইতিমধ্যে যাইহোক আমার সমাধান এ এটি করছি।
  • স্ট্যান্ডার্ড উইন্ডোজ স্টাইলটি প্রথম প্রয়োজনীয় আর্গুমেন্ট মান দিয়ে শুরু হওয়ার সম্ভাবনাটি বাদ দেয় /। এই সীমাবদ্ধতা একটি অন্তর্নিহিত সংজ্ঞায়িত //বিকল্প নিয়োগের মাধ্যমে অপসারণ করা যেতে পারে যা বিকল্প পার্সিং লুপটি থেকে বেরিয়ে যাওয়ার সংকেত হিসাবে কাজ করে। //"বিকল্প" এর জন্য কিছুই সংরক্ষণ করা হবে না ।


2015-12-28 আপডেট করুন:! বিকল্পের মানগুলির জন্য সমর্থন

উপরের কোডে, প্রতিটি যুক্তি প্রসারিত যখন বিলম্বিত সম্প্রসারণ সক্ষম করা হয়, যার অর্থ !সম্ভবত সম্ভবত ছিটকে যাওয়া, বা অন্য কোনও কিছু !var!প্রসারিত করা হয়। উপরন্তু, ^যদি ছিনতাই করা যাবে !উপস্থিত। আন-মন্তব্য কোডে নিম্নলিখিত ছোট পরিবর্তন সীমাবদ্ধতা যেমন যে সরিয়ে ফেলা হবে !এবং ^বিকল্প মান সংরক্ষিত আছে।

@echo off
setlocal enableDelayedExpansion

set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"

for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
if not "%~3"=="" (
  set "test=!options:*%~3:=! "
  if "!test!"=="!options! " (
      echo Error: Invalid option %~3
  ) else if "!test:~0,1!"==" " (
      set "%~3=1"
  ) else (
      setlocal disableDelayedExpansion
      set "val=%~4"
      call :escapeVal
      setlocal enableDelayedExpansion
      for /f delims^=^ eol^= %%A in ("!val!") do endlocal&endlocal&set "%~3=%%A" !
      shift /3
  )
  shift /3
  goto :loop
)
goto :endArgs
:escapeVal
set "val=%val:^=^^%"
set "val=%val:!=^!%"
exit /b
:endArgs

set -

:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!

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

4
খুব মার্জিত সমাধান। আপনি যদি এটি ব্যবহার করার বিষয়ে বিবেচনা করেন তবে সচেতন হন যে প্রদত্ত কোডটি 3 টি যুক্তিতে পার্স করা শুরু করবে This এটি সাধারণ ক্ষেত্রে আপনি যা চান তা নয়। এটি ঠিক করতে "1" এর দ্বারা "3" প্রতিস্থাপন করুন। @ ডিবেনহ্যাম এটি দুর্দান্ত লাগবে যদি আপনি মূল পোস্টে এটি আরও সুস্পষ্ট করে তুলতে পারেন, আমি সম্ভবত প্রথম ব্যক্তিই নই যিনি প্রথমে বিভ্রান্ত হয়েছিলেন।
13

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

আমি এটা ভালোবাসি. সমাধানের জন্য আপনাকে ধন্যবাদ, কিছু আইডিই স্ক্রিপ্টিংয়ের জন্য এটি 2019 এ এখনও বেশ পরিচ্ছন্নভাবে কাজ করে!
রবার্ট স্মিথ

18

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

REM Get argument values.  If not specified, use default values.
IF "%1"=="" ( SET "DatabaseServer=localhost" ) ELSE ( SET "DatabaseServer=%1" )
IF "%2"=="" ( SET "DatabaseName=MyDatabase" ) ELSE ( SET "DatabaseName=%2" )

REM Do work
ECHO Database Server = %DatabaseServer%
ECHO Database Name   = %DatabaseName%

IF "%1"==""যদি যুক্তিতে নিজেই উদ্ধৃতি থাকে তবে ব্যর্থ হবে। পরিবর্তে অন্য যে কোনও অ-বিশেষ চিহ্ন ব্যবহার করুন, যেমন ._ = [] # ইত্যাদি
ফ্র0sT

4
আমি মনে করি না যদি ব্যবহারকারী আর্গুমেন্টের জায়গায় "" ব্যবহার করতে না জেনে থাকে তবে এটি কাজ করে। অন্যথায়, আমি কীভাবে কোনও ডিবি নাম সেট করতে পারি তবে ডিবি সার্ভারটি ফাঁকা রেখে দেব?
শান লং

আর কীভাবে আপনি অন্য উত্তর দেখতে পেলেন? @SeanLong
sehe

@ সানলং রাইট, তাই ব্যবহারকারীকে অবশ্যই আদেশটি মানতে হবে। সুতরাং, আপনার প্রথম স্থানে সর্বাধিক প্রয়োজনীয় যুক্তি দেওয়া উচিত।
মার্টিন ব্রাউন

এটি অবশ্যই আমার জন্য সবচেয়ে সহজ বিকল্প ছিল। পোস্ট করার জন্য ধন্যবাদ :)
স্টিভ বাউমান

3

গতিশীল ভেরিয়েবল তৈরি

এখানে চিত্র বর্ণনা লিখুন

পেশাদাররা

  • > 9 টি আর্গুমেন্টের জন্য কাজ করে
  • কৌশলে রাখে %1, %2...%*
  • উভয় /argএবং -argশৈলী জন্য কাজ করে
  • যুক্তি সম্পর্কে পূর্বের জ্ঞান নেই
  • বাস্তবায়ন মূল রুটিন থেকে পৃথক

কনস

  • পুরানো যুক্তিগুলি একটানা setlocalরানগুলিতে ফাঁস হতে পারে, সেইজন্য স্থানীয় স্কোপিংয়ের জন্য ব্যবহার করুন বা তার সাথে :CLEAR-ARGSনিয়মিত লিখুন !
  • এখনও কোনও উপনাম সমর্থন নেই (পছন্দ --forceকরতে পারেন -f)
  • কোনও খালি ""যুক্তির সমর্থন নেই

ব্যবহার

নীচের যুক্তিগুলি .bat ভেরিয়েবলের সাথে কীভাবে সম্পর্কিত তা এখানে একটি উদাহরণ রয়েছে:

>> testargs.bat /b 3 -c /d /e /f /g /h /i /j /k /bar 5 /foo "c:\"

echo %*        | /b 3 -c /d /e /f /g /h /i /j /k /bar 5 /foo "c:\"
echo %ARG_FOO% | c:\
echo %ARG_A%   |
echo %ARG_B%   | 3
echo %ARG_C%   | 1
echo %ARG_D%   | 1

বাস্তবায়ন

@echo off
setlocal

CALL :ARG-PARSER %*

::Print examples
echo: ALL: %*
echo: FOO: %ARG_FOO%
echo: A:   %ARG_A%
echo: B:   %ARG_B%
echo: C:   %ARG_C%
echo: D:   %ARG_C%


::*********************************************************
:: Parse commandline arguments into sane variables
:: See the following scenario as usage example:
:: >> thisfile.bat /a /b "c:\" /c /foo 5
:: >> CALL :ARG-PARSER %*
:: ARG_a=1
:: ARG_b=c:\
:: ARG_c=1
:: ARG_foo=5
::*********************************************************
:ARG-PARSER
    ::Loop until two consecutive empty args
    :loopargs
        IF "%~1%~2" EQU "" GOTO :EOF

        set "arg1=%~1" 
        set "arg2=%~2"
        shift

        ::Allow either / or -
        set "tst1=%arg1:-=/%"
        if "%arg1%" NEQ "" (
            set "tst1=%tst1:~0,1%"
        ) ELSE (
            set "tst1="
        )

        set "tst2=%arg2:-=/%"
        if "%arg2%" NEQ "" (
            set "tst2=%tst2:~0,1%"
        ) ELSE (
            set "tst2="
        )


        ::Capture assignments (eg. /foo bar)
        IF "%tst1%" EQU "/"  IF "%tst2%" NEQ "/" IF "%tst2%" NEQ "" (
            set "ARG_%arg1:~1%=%arg2%"
            GOTO loopargs
        )

        ::Capture flags (eg. /foo)
        IF "%tst1%" EQU "/" (
            set "ARG_%arg1:~1%=1"
            GOTO loopargs
        )
    goto loopargs
GOTO :EOF


আপনি :ARG-PARSERরুটিনের বিষয়বস্তুগুলি কোনও বহিরাগত। ব্যাট ফাইলেও স্থানান্তর arg-parser.batকরতে পারেন এটি অন্যান্য স্ক্রিপ্টগুলিতেও উপলব্ধ করতে পছন্দ করে।
সাইমন স্ট্রাইচার

1

একবার আমি একটি প্রোগ্রাম লিখেছিলাম যা ব্যাচ ফাইলে সংক্ষিপ্ত (-h), দীর্ঘ (--হেল্প) এবং অ-বিকল্প যুক্তিগুলি পরিচালনা করে। এই কৌশলগুলির মধ্যে রয়েছে:

  • অপশন যুক্তিগুলির পরে অ-বিকল্প যুক্তি।

  • সেই বিকল্পগুলির জন্য শিফট অপারেটর যার '--help' এর মত যুক্তি নেই।

  • সেই বিকল্পগুলির জন্য দ্বিমাত্রিক শিফট অপারেটর যা একটি যুক্তির প্রয়োজন।

  • সমস্ত কমান্ড লাইন আর্গুমেন্ট প্রক্রিয়াকরণের জন্য একটি লেবেল মাধ্যমে লুপ।

  • স্ক্রিপ্ট থেকে প্রস্থান করুন এবং সেই বিকল্পগুলির জন্য প্রক্রিয়া বন্ধ করুন যাতে '--help' এর মতো পরবর্তী ক্রিয়া প্রয়োজন হয় না।

  • ব্যবহারকারীর নির্দেশিকাগুলির জন্য সহায়তা ফাংশন লিখেছিলেন

এখানে আমার কোড।

set BOARD=
set WORKSPACE=
set CFLAGS=
set LIB_INSTALL=true
set PREFIX=lib
set PROGRAM=install_boards

:initial
 set result=false
 if "%1" == "-h" set result=true
 if "%1" == "--help" set result=true
 if "%result%" == "true" (
 goto :usage
 )
 if "%1" == "-b" set result=true
 if "%1" == "--board" set result=true
 if "%result%" == "true" (
 goto :board_list
 )
 if "%1" == "-n" set result=true
 if "%1" == "--no-lib" set result=true
 if "%result%" == "true" (
 set LIB_INSTALL=false
 shift & goto :initial
 )
 if "%1" == "-c" set result=true
 if "%1" == "--cflag" set result=true
 if "%result%" == "true" (
 set CFLAGS=%2
 if not defined CFLAGS (
 echo %PROGRAM%: option requires an argument -- 'c'
 goto :try_usage
 )
 shift & shift & goto :initial
 )
 if "%1" == "-p" set result=true
 if "%1" == "--prefix" set result=true
 if "%result%" == "true" (
 set PREFIX=%2
 if not defined PREFIX (
 echo %PROGRAM%: option requires an argument -- 'p'
 goto :try_usage
 )
 shift & shift & goto :initial
 )

:: handle non-option arguments
set BOARD=%1
set WORKSPACE=%2

goto :eof


:: Help section

:usage
echo Usage: %PROGRAM% [OPTIONS]... BOARD... WORKSPACE
echo Install BOARD to WORKSPACE location.
echo WORKSPACE directory doesn't already exist!
echo.
echo Mandatory arguments to long options are mandatory for short options too.
echo   -h, --help                   display this help and exit
echo   -b, --boards                 inquire about available CS3 boards
echo   -c, --cflag=CFLAGS           making the CS3 BOARD libraries for CFLAGS
echo   -p. --prefix=PREFIX          install CS3 BOARD libraries in PREFIX
echo                                [lib]
echo   -n, --no-lib                 don't install CS3 BOARD libraries by default
goto :eof

:try_usage
echo Try '%PROGRAM% --help' for more information
goto :eof

1

এখানে আর্গুমেন্ট পার্সার রয়েছে। আপনি যে কোনও স্ট্রিং আর্গুমেন্ট (অচেনা রাখা) বা পালানো বিকল্পগুলি (একক বা বিকল্প / মান জোড়া) মিশ্রিত করতে পারেন। এটি শেষের 2 টি বিবৃতিটি অসম্পূর্ণ পরীক্ষা করার জন্য এবং চালনা করুন:

getargs anystr1 anystr2 /test$1 /test$2=123 /test$3 str anystr3

এস্কেপ চর হিসাবে সংজ্ঞা দেওয়া হয়েছে "_SEP_=/", প্রয়োজনে পুনরায় সংজ্ঞা দিন ।

@echo off

REM Command line argument parser. Format (both "=" and "space" separators are supported):
REM   anystring1 anystring2 /param1 /param2=value2 /param3 value3 [...] anystring3 anystring4
REM Returns enviroment variables as:
REM   param1=1
REM   param2=value2
REM   param3=value3
REM Leading and traling strings are preserved as %1, %2, %3 ... %9 parameters
REM but maximum total number of strings is 9 and max number of leading strings is 8
REM Number of parameters is not limited!

set _CNT_=1
set _SEP_=/

:PARSE

if %_CNT_%==1 set _PARAM1_=%1 & set _PARAM2_=%2
if %_CNT_%==2 set _PARAM1_=%2 & set _PARAM2_=%3
if %_CNT_%==3 set _PARAM1_=%3 & set _PARAM2_=%4
if %_CNT_%==4 set _PARAM1_=%4 & set _PARAM2_=%5
if %_CNT_%==5 set _PARAM1_=%5 & set _PARAM2_=%6
if %_CNT_%==6 set _PARAM1_=%6 & set _PARAM2_=%7
if %_CNT_%==7 set _PARAM1_=%7 & set _PARAM2_=%8
if %_CNT_%==8 set _PARAM1_=%8 & set _PARAM2_=%9

if "%_PARAM2_%"=="" set _PARAM2_=1

if "%_PARAM1_:~0,1%"=="%_SEP_%" (
  if "%_PARAM2_:~0,1%"=="%_SEP_%" (
    set %_PARAM1_:~1,-1%=1
    shift /%_CNT_%
  ) else (
    set %_PARAM1_:~1,-1%=%_PARAM2_%
    shift /%_CNT_%
    shift /%_CNT_%
  )
) else (
  set /a _CNT_+=1
)

if /i %_CNT_% LSS 9 goto :PARSE

set _PARAM1_=
set _PARAM2_=
set _CNT_=

rem getargs anystr1 anystr2 /test$1 /test$2=123 /test$3 str anystr3
rem set | find "test$"
rem echo %1 %2 %3 %4 %5 %6 %7 %8 %9

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