নির্বাচিত উত্তরটি কাজ করে তবে এটি কিছু উন্নতি করতে পারে।
- বিকল্পগুলি সম্ভবত ডিফল্ট মানগুলিতে শুরু করা উচিত।
- এটি প্রয়োজনীয়% টি% 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!