about_Script_Blocks

Deskripsi singkat

Menentukan apa itu blok skrip dan menjelaskan cara menggunakan blok skrip dalam bahasa pemrograman PowerShell.

Deskripsi panjang

Dalam bahasa pemrograman PowerShell, blok skrip adalah kumpulan pernyataan atau ekspresi yang dapat digunakan sebagai satu unit. Kumpulan pernyataan dapat diapit kurung kurawal ({}), didefinisikan sebagai fungsi, atau disimpan dalam file skrip. Blok skrip dapat mengembalikan nilai dan menerima parameter dan argumen.

Secara sintis, blok skrip adalah daftar pernyataan dalam kurung kurawal, seperti yang ditunjukkan dalam sintaks berikut:

{<statement list>}

Blok skrip mengembalikan output semua perintah di blok skrip, baik sebagai objek tunggal atau sebagai array.

Anda juga dapat menentukan nilai pengembalian menggunakan return kata kunci. Kata return kunci tidak memengaruhi atau menekan output lain yang dikembalikan dari blok skrip Anda. Namun, return kata kunci keluar dari blok skrip pada baris tersebut. Untuk informasi selengkapnya, lihat about_Return.

Seperti fungsi, blok skrip dapat menyertakan parameter. Gunakan kata kunci Param untuk menetapkan parameter bernama, seperti yang ditunjukkan dalam sintaks berikut:

{
    Param([type]$Parameter1 [,[type]$Parameter2])
    <statement list>
}

Catatan

Dalam blok skrip, tidak seperti fungsi, Anda tidak dapat menentukan parameter di luar kurung kurawal.

Seperti fungsi, blok skrip dapat menyertakan DynamicParamkata kunci , , BeginProcess, dan End . Untuk informasi selengkapnya, lihat about_Functions dan about_Functions_Advanced.

Menggunakan Blok Skrip

Blok skrip adalah instans jenis System.Management.Automation.ScriptBlockMicrosoft .NET Framework . Perintah dapat memiliki nilai parameter blok skrip. Misalnya, Invoke-Command cmdlet memiliki ScriptBlock parameter yang mengambil nilai blok skrip, seperti yang ditunjukkan dalam contoh ini:

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
...

Invoke-Command juga dapat menjalankan blok skrip yang memiliki blok parameter. Parameter ditetapkan berdasarkan posisi menggunakan parameter ArgumentList .

Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second

Blok skrip dalam contoh sebelumnya menggunakan param kata kunci untuk membuat parameter $p1 dan $p2. String "Pertama" terikat ke parameter pertama ($p1) dan "Kedua" terikat ke ($p2).

Untuk informasi selengkapnya tentang perilaku ArgumentList, lihat about_Splatting.

Anda dapat menggunakan variabel untuk menyimpan dan menjalankan blok skrip. Contoh di bawah ini menyimpan blok skrip dalam variabel dan meneruskannya ke Invoke-Command.

$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status   Name               DisplayName
------   ----               -----------
Running  BITS               Background Intelligent Transfer Ser...

Operator panggilan adalah cara lain untuk menjalankan blok skrip yang disimpan dalam variabel. Seperti Invoke-Command, operator panggilan menjalankan blok skrip dalam cakupan anak. Operator panggilan dapat memudahkan Anda menggunakan parameter dengan blok skrip Anda.

$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First

Anda dapat menyimpan output dari blok skrip Anda dalam variabel menggunakan penugasan.

PS>  $a = { 1 + 1}
PS>  $b = &$a
PS>  $b
2
PS>  $a = { 1 + 1}
PS>  $b = Invoke-Command $a
PS>  $b
2

Untuk informasi selengkapnya tentang operator panggilan, lihat about_Operators.

Menggunakan blok skrip tertunda-ikat dengan parameter

Parameter yang dititik yang menerima input alur memungkinkan penggunaan blok skrip yang tertunda-ikat pada parameter . Anda dapat menggunakan blok skrip tertunda-ikat sebagai singkatan untuk menentukan parameter untuk cmdlet yang disalurkan sebelum mengeksekusinya.

Dalam blok skrip yang mengikat penundaan, Anda dapat mereferensikan pipa dalam objek menggunakan variabel $_alur .

# 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)" }

Dalam cmdlet yang lebih kompleks, blok skrip yang tertunda memungkinkan penggunaan kembali satu pipa dalam objek untuk mengisi parameter lain.

Catatan tentang blok skrip yang mengikat penundaan sebagai parameter:

  • Anda harus secara eksplisit menentukan nama parameter apa pun yang Anda gunakan dengan blok skrip yang tertunda-ikat.

  • Parameter tidak boleh di-untyped, dan jenis parameter tidak boleh [scriptblock] atau [object].

  • Anda menerima kesalahan jika Anda menggunakan blok skrip yang tertunda-ikat tanpa memberikan input alur.

    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
    

Lihat juga