ค้นหาเว็บไซต์

เกี่ยวกับสคริปต์บล็อก


คำอธิบายสั้น ๆ

กำหนดว่าบล็อกสคริปต์คืออะไร และอธิบายวิธีใช้บล็อกสคริปต์ในภาษาการเขียนโปรแกรม 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

บทความที่เกี่ยวข้อง