เกี่ยวกับสคริปต์บล็อก
คำอธิบายสั้น ๆ
กำหนดว่าบล็อกสคริปต์คืออะไร และอธิบายวิธีใช้บล็อกสคริปต์ในภาษาการเขียนโปรแกรม PowerShell
คำอธิบายยาว
ในภาษาการเขียนโปรแกรม PowerShell บล็อกสคริปต์คือชุดของคำสั่งหรือนิพจน์ที่สามารถใช้เป็นหน่วยเดียวได้ ชุดคำสั่งสามารถใส่เครื่องหมายปีกกา ({}) กำหนดให้เป็นฟังก์ชัน หรือบันทึกเป็นไฟล์สคริปต์ได้ บล็อกสคริปต์สามารถส่งคืนค่าและยอมรับพารามิเตอร์และอาร์กิวเมนต์ได้
ในทางวากยสัมพันธ์ บล็อกสคริปต์คือรายการคำสั่งที่อยู่ในเครื่องหมายปีกกา ดังที่แสดงในไวยากรณ์ต่อไปนี้:
{<statement list>}
บล็อกสคริปต์ส่งคืนเอาต์พุตของคำสั่งทั้งหมดในบล็อกสคริปต์ ไม่ว่าจะเป็นออบเจ็กต์เดียวหรือเป็นอาร์เรย์
คุณยังสามารถระบุค่าตอบแทนโดยใช้คีย์เวิร์ด return คีย์เวิร์ด return ไม่ส่งผลกระทบหรือระงับเอาต์พุตอื่นๆ ที่ส่งคืนจากบล็อกสคริปต์ของคุณ อย่างไรก็ตาม คีย์เวิร์ด return จะออกจากบล็อกสคริปต์ที่บรรทัดนั้น สำหรับข้อมูลเพิ่มเติม โปรดดูที่ about_Return
เช่นเดียวกับฟังก์ชัน บล็อกสคริปต์สามารถรวมพารามิเตอร์ได้ ใช้คีย์เวิร์ด Param เพื่อกำหนดพารามิเตอร์ที่มีชื่อ ดังที่แสดงในไวยากรณ์ต่อไปนี้:
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
บันทึก
ในบล็อกสคริปต์ คุณไม่สามารถระบุพารามิเตอร์นอกเครื่องหมายปีกกาได้ ซึ่งต่างจากฟังก์ชัน
เช่นเดียวกับฟังก์ชัน บล็อกสคริปต์สามารถรวมคำหลัก dynamicparam, begin, process และ end สำหรับข้อมูลเพิ่มเติม โปรดดู about_Functions และ about_Functions_Advanced
การใช้สคริปต์บล็อก
บล็อกสคริปต์คืออินสแตนซ์ของประเภท Microsoft .NET Framework System.Management.Automation.ScriptBlock คำสั่งสามารถมีค่าพารามิเตอร์บล็อกสคริปต์ได้ ตัวอย่างเช่น Invoke-Command cmdlet มีพารามิเตอร์ ScriptBlock ที่ใช้ค่าบล็อกสคริปต์ ดังที่แสดงในตัวอย่างนี้:
Invoke-Command -ScriptBlock { Get-Process }
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
999 28 39100 45020 262 15.88 1844 communicator
721 28 32696 36536 222 20.84 4028 explorer
...
Inrigger-Command ยังสามารถดำเนินการบล็อกสคริปต์ที่มีบล็อกพารามิเตอร์ได้ พารามิเตอร์ถูกกำหนดตามตำแหน่งโดยใช้พารามิเตอร์ ArgumentList
Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second
บล็อกสคริปต์ในตัวอย่างก่อนหน้านี้ใช้คีย์เวิร์ด param เพื่อสร้างพารามิเตอร์ $p1 และ $p2 สตริง "First" ถูกผูกไว้กับพารามิเตอร์แรก ($p1) และ "Second" ถูกผูกไว้กับ ($p2)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทำงานของ ArgumentList โปรดดู about_Splatting
คุณสามารถใช้ตัวแปรเพื่อจัดเก็บและดำเนินการบล็อกสคริปต์ได้ ตัวอย่างด้านล่างจัดเก็บบล็อกสคริปต์ไว้ในตัวแปรและส่งผ่านไปยัง Invive-Command
$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status Name DisplayName
------ ---- -----------
Running BITS Background Intelligent Transfer Ser...
ตัวดำเนินการเรียกเป็นอีกวิธีหนึ่งในการดำเนินการบล็อกสคริปต์ที่จัดเก็บไว้ในตัวแปร เช่นเดียวกับ Invoke-Command ตัวดำเนินการเรียกดำเนินการบล็อกสคริปต์ในขอบเขตลูก เจ้าหน้าที่รับสายสามารถช่วยให้คุณใช้พารามิเตอร์กับบล็อกสคริปต์ของคุณได้ง่ายขึ้น
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
คุณสามารถจัดเก็บเอาต์พุตจากบล็อกสคริปต์ของคุณในตัวแปรโดยใช้การกำหนด
PS> $a = { 1 + 1}
PS> $b = &$a
PS> $b
2
PS> $a = { 1 + 1}
PS> $b = Invoke-Command $a
PS> $b
2
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวดำเนินการโทร โปรดดูที่ about_Operators
การใช้บล็อกสคริปต์ที่ผูกล่าช้าพร้อมพารามิเตอร์
พารามิเตอร์ที่พิมพ์ซึ่งยอมรับอินพุตไปป์ไลน์ทำให้สามารถใช้บล็อกสคริปต์ delay-bind บนพารามิเตอร์ได้ คุณสามารถใช้บล็อกสคริปต์ที่ผูกล่าช้าเป็นชวเลขเพื่อกำหนดพารามิเตอร์สำหรับ Pipelined cmdlet ก่อนที่จะดำเนินการ
ภายในบล็อกสคริปต์ที่ผูกล่าช้า คุณสามารถอ้างอิงไปป์ในออบเจ็กต์ได้โดยใช้ตัวแปรไปป์ไลน์ $_
# Both examples rename config.log to old_config.log
# Without delay-binding
dir config.log | ForEach-Object -Process {
Rename-Item -Path $_ -NewName "old_$($_.Name)"
}
# With delay-binding
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }
ใน cmdlet ที่ซับซ้อนมากขึ้น บล็อกสคริปต์ที่ผูกล่าช้าอนุญาตให้นำหนึ่งไปป์ในวัตถุเพื่อเติมพารามิเตอร์อื่น ๆ ได้
หมายเหตุเกี่ยวกับบล็อกสคริปต์ที่ผูกล่าช้าเป็นพารามิเตอร์:
คุณต้องระบุชื่อพารามิเตอร์ใดๆ ที่คุณใช้กับบล็อกสคริปต์ที่ผูกล่าช้าอย่างชัดเจน
พารามิเตอร์จะต้องไม่ถูกพิมพ์ และประเภทของพารามิเตอร์ไม่สามารถเป็น
[scriptblock]หรือ[object]คุณได้รับข้อผิดพลาดหากคุณใช้บล็อกสคริปต์การผูกล่าช้าโดยไม่ต้องป้อนข้อมูลไปป์ไลน์
Rename-Item -NewName {$_.Name + ".old"}Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input. At line:1 char:23 + Rename-Item -NewName {$_.Name + ".old"} + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId : ScriptBlockArgumentNoInput, Microsoft.PowerShell.Commands.RenameItemCommand
ดูเพิ่มเติม
- about_Functions
- about_Functions_ขั้นสูง
- about_Operators