এখানে কিছু ভাল উত্তর আছে, তবে আমি কয়েকটি বিষয় উল্লেখ করতে চাই। ফাংশন প্যারামিটারগুলি আসলে এমন এক জায়গা যেখানে পাওয়ারশেল জ্বলজ্বল করে। উদাহরণস্বরূপ, আপনি এর মতো উন্নত ফাংশনে নাম বা অবস্থানগত পরামিতি থাকতে পারেন:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
তারপরে আপনি প্যারামিটারের নাম নির্দিষ্ট করে এটি কল করতে পারেন, বা আপনি কেবলমাত্র অবস্থানগত পরামিতি ব্যবহার করতে পারেন, কারণ আপনি এগুলি স্পষ্টভাবে সংজ্ঞায়িত করেছেন। সুতরাং এর যে কোনও একটি কাজ করবে:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Name
দ্বিতীয়টি প্রদান করা সত্ত্বেও প্রথম উদাহরণটি কাজ করে , কারণ আমরা স্পষ্টভাবে প্যারামিটারের নামটি ব্যবহার করেছি। দ্বিতীয় উদাহরণটি পজিশনের উপর ভিত্তি করে কাজ করে, তবে Name
এটি প্রথম হওয়া দরকার। যখন সম্ভব হয়, আমি সর্বদা অবস্থানগুলি সংজ্ঞায়িত করার চেষ্টা করি যাতে উভয় বিকল্প উপলব্ধ।
পাওয়ারশেলের পরামিতি সেটগুলি সংজ্ঞায়িত করার ক্ষমতাও রয়েছে। এটি পদ্ধতি ওভারলোডিংয়ের জায়গায় এটি ব্যবহার করে এবং আবার বেশ কার্যকর:
function Get-Something
{
[CmdletBinding(DefaultParameterSetName='Name')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
[string] $Name,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
[int] $Id
)
}
এখন ফাংশনটি হয় একটি নাম, বা একটি আইডি নেবে, তবে উভয়ই নয়। আপনি এগুলি অবস্থানগতভাবে বা নামে ব্যবহার করতে পারেন। যেহেতু এগুলি ভিন্ন ধরণের, পাওয়ারশেল এটিকে খুঁজে বের করবে। সুতরাং এই সব কাজ করবে:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
আপনি বিভিন্ন পরামিতি সেটগুলিতে অতিরিক্ত পরামিতিগুলিও বরাদ্দ করতে পারেন। (এটি স্পষ্টতই একটি চমত্কার প্রাথমিক উদাহরণ ছিল)) ফাংশনের অভ্যন্তরে, আপনি নির্ধারণ করতে পারবেন কোন প্যারামিটার সেটটি $ PSCmdlet.ParameterSetName বৈশিষ্ট্যের সাথে ব্যবহৃত হয়েছিল। উদাহরণ স্বরূপ:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
তারপরে, সম্পর্কিত সাইড নোটে, পাওয়ারশেলে প্যারামিটারের বৈধতাও রয়েছে। এটি আমার প্রিয় পাওয়ারশেল বৈশিষ্ট্যগুলির মধ্যে একটি এবং এটি আপনার ফাংশনের অভ্যন্তরীণ কোডটিকে খুব পরিষ্কার করে। আপনি ব্যবহার করতে পারেন অসংখ্য বৈধতা আছে। উদাহরণ দুটি:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
প্রথম উদাহরণে, ValidatePattern একটি নিয়মিত অভিব্যক্তি গ্রহণ করে যা সরবরাহিত প্যারামিটারটি আপনি যা প্রত্যাশা করছেন তার সাথে মেলে তা নিশ্চিত করে। যদি এটি না হয় তবে একটি अंतर्জ্ঞাত ব্যতিক্রম ছুঁড়ে দেওয়া হবে, আপনাকে ভুলটি ঠিক কী বলেছে। সুতরাং এই উদাহরণে, 'কিছু' ভাল কাজ করবে, তবে 'গ্রীষ্ম' বৈধতা পাস করবে না।
ValidateRange নিশ্চিত করে যে কোনও পূর্ণসংখ্যার জন্য প্যারামিটার মানটি আপনি যে পরিসরের জন্য প্রত্যাশা করেন তার মধ্যে রয়েছে। সুতরাং 10 বা 99 কাজ করবে তবে 101 ব্যতিক্রম করবে।
আর একটি দরকারী হ'ল ভ্যালিডেটসেট, যা আপনাকে স্পষ্টভাবে গ্রহণযোগ্য মানগুলির একটি অ্যারে সংজ্ঞায়িত করতে দেয়। অন্য কিছু প্রবেশ করা হলে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে। এছাড়াও অন্যান্য রয়েছে, তবে সম্ভবত সবচেয়ে কার্যকর একটি হল ভ্যালিডেটস্ক্রিপ্ট। এটি একটি স্ক্রিপ্ট ব্লক নেয় যা অবশ্যই must সত্যের কাছে মূল্যায়ন করতে পারে তাই আকাশ সীমাবদ্ধ। উদাহরণ স্বরূপ:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
এই উদাহরণে, আমরা নিশ্চিত হয়েছি যে কেবলমাত্র $ পাথ বিদ্যমান, তবে এটি একটি ফাইল, (ডিরেক্টরিতে বিপরীতে) এবং এর একটি .csv এক্সটেনশন রয়েছে। (script _ আপনার স্ক্রিপ্টব্লকের ভিতরে থাকা অবস্থায় প্যারামিটারকে বোঝায়)) সেই স্তরটি যদি প্রয়োজন হয় তবে আপনি আরও বৃহত্তর, বহু-লাইন স্ক্রিপ্ট ব্লকেও পাস করতে পারেন, বা আমি এখানে যেমন করেছি একাধিক স্ক্রিপ্টব্লক ব্যবহার করতে পারি। এটি অত্যন্ত কার্যকর এবং সুন্দর পরিষ্কার ফাংশন এবং স্বজ্ঞাত ব্যতিক্রমগুলির জন্য তোলে।
Test "ABC" "DEF"