มีคำตอบที่ดีอยู่ที่นี่ แต่ฉันต้องการชี้ให้เห็นอีกสองสิ่ง พารามิเตอร์ฟังก์ชั่นเป็นสถานที่ที่ PowerShell ส่องสว่าง ตัวอย่างเช่นคุณสามารถมีพารามิเตอร์ที่ระบุชื่อหรือตำแหน่งในฟังก์ชันขั้นสูงเช่น:
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
จะต้องเป็นอันดับแรก เมื่อเป็นไปได้ฉันพยายามกำหนดตำแหน่งเพื่อให้ทั้งสองตัวเลือกพร้อมใช้งาน
PowerShell ยังมีความสามารถในการกำหนดชุดพารามิเตอร์ มันใช้วิธีนี้แทนวิธีการมากไปและอีกครั้งมีประโยชน์มาก:
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
)
}
ตอนนี้ฟังก์ชั่นจะใช้ชื่อหรือรหัส แต่ไม่ใช่ทั้งสองอย่าง คุณสามารถใช้พวกเขาตามตำแหน่งหรือตามชื่อ เนื่องจากเป็นประเภทที่แตกต่างกัน PowerShell จะคิดออก ดังนั้นสิ่งเหล่านี้จะได้ผล:
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"
}
จากนั้นในบันทึกด้านข้างที่เกี่ยวข้องนอกจากนี้ยังมีการตรวจสอบความถูกต้องของพารามิเตอร์ใน PowerShell นี่เป็นหนึ่งในคุณสมบัติ PowerShell ที่ฉันโปรดปรานและทำให้โค้ดภายในฟังก์ชั่นของคุณสะอาดมาก มีการตรวจสอบมากมายที่คุณสามารถใช้ได้ สองตัวอย่างคือ:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
ในตัวอย่างแรก ValidatePattern ยอมรับการแสดงออกปกติที่มั่นใจว่าพารามิเตอร์ที่ให้มาตรงกับสิ่งที่คุณคาดหวัง หากไม่เป็นเช่นนั้นจะมีการโยนข้อยกเว้นตามสัญชาตญาณเพื่อบอกคุณว่ามีอะไรผิดปกติ ดังนั้นในตัวอย่างนั้น 'Something' จะทำงานได้ดี แต่ 'Summer' จะไม่ผ่านการตรวจสอบ
ValidateRange ทำให้แน่ใจว่าค่าพารามิเตอร์อยู่ในช่วงที่คุณคาดหวังสำหรับจำนวนเต็ม ดังนั้น 10 หรือ 99 ก็ใช้ได้ แต่ 101 จะมีข้อยกเว้น
อีกชุดหนึ่งที่มีประโยชน์คือ ValidateSet ซึ่งช่วยให้คุณสามารถกำหนดอาร์เรย์ของค่าที่ยอมรับได้อย่างชัดเจน หากป้อนอย่างอื่นข้อยกเว้นจะถูกโยนทิ้ง มีคนอื่นเช่นกัน แต่อาจเป็นประโยชน์มากที่สุดคือ ValidateScript สิ่งนี้ใช้บล็อกสคริปต์ที่ต้องประเมินเป็น $ true ดังนั้นท้องฟ้าจึงมีข้อ จำกัด ตัวอย่างเช่น:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
ในตัวอย่างนี้เราไม่เพียง แต่มั่นใจว่า $ Path มีอยู่ แต่มันเป็นไฟล์ (ตรงข้ามกับไดเรกทอรี) และมีนามสกุลเป็น. csv ($ _ อ้างอิงถึงพารามิเตอร์เมื่ออยู่ใน scriptblock ของคุณ) คุณยังสามารถผ่านบล็อกสคริปต์แบบหลายบรรทัดที่ใหญ่กว่านี้ได้หากจำเป็นต้องใช้ระดับนั้นหรือใช้สคริปต์แบบหลายบล็อกเหมือนที่ฉันทำที่นี่ มันมีประโยชน์อย่างมากและทำให้ฟังก์ชั่นที่ดีสะอาดและข้อยกเว้นที่ใช้งานง่าย
Test "ABC" "DEF"