Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penulisan Skenario
Ketika Anda berpindah dari menulis perintah satu baris PowerShell ke penulisan skrip, itu terdengar lebih rumit daripada yang sebenarnya. Skrip tidak lebih dari perintah yang sama atau serupa yang Anda jalankan secara interaktif di konsol PowerShell, kecuali Anda menyimpannya sebagai .ps1 file. Ada beberapa struktur skrip yang mungkin Anda gunakan, misalnya perulangan foreach alih-alih cmdlet ForEach-Object. Perbedaannya bisa membingungkan bagi pemula ketika mempertimbangkan bahwa foreach itu adalah kata kunci bahasa dan alias untuk ForEach-Object cmdlet.
Perulangan
Salah satu aspek terbaik PowerShell adalah skalabilitasnya. Setelah Anda mempelajari cara melakukan tugas untuk satu item, menerapkan tindakan yang sama ke ratusan item hampir sama mudahnya. Lakukan perulangan pada item menggunakan salah satu dari berbagai jenis perulangan di PowerShell.
ForEach-Object
ForEach-Object adalah cmdlet untuk melakukan iterasi pada item dalam pipeline, seperti pada satu baris PowerShell.
ForEach-Object mengirimkan objek melalui jalur pemrosesan.
Meskipun parameter Get-Command menerima beberapa nilai string, parameter hanya menerimanya melalui input alur berdasarkan nama properti. Dalam skenario berikut, jika Anda ingin menyalurkan dua nilai string ke Get-Command untuk digunakan dengan parameter Module, Anda perlu menggunakan cmdlet ForEach-Object.
'ActiveDirectory', 'SQLServer' |
ForEach-Object {Get-Command -Module $_} |
Group-Object -Property ModuleName -NoElement |
Sort-Object -Property Count -Descending
Count Name
----- ----
147 ActiveDirectory
82 SqlServer
Dalam contoh sebelumnya, $_ adalah objek saat ini. Dimulai dengan PowerShell versi 3.0, $PSItem dapat digunakan alih-alih $_. Sebagian besar pengguna PowerShell yang berpengalaman lebih suka menggunakan $_ karena kompatibel dengan versi sebelumnya dan lebih sedikit untuk diketik.
Saat menggunakan kata kunci foreach, Anda harus menyimpan item dalam memori sebelum melakukan iterasi melalui item tersebut, yang mungkin berupa tantangan jika Anda tidak tahu berapa banyak item yang sedang Anda kerjakan.
$ComputerName = 'DC01', 'WEB01'
foreach ($Computer in $ComputerName) {
Get-ADComputer -Identity $Computer
}
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=mikefrobbins,DC=com
DNSHostName : dc01.mikefrobbins.com
Enabled : True
Name : DC01
ObjectClass : computer
ObjectGUID : c38da20c-a484-469d-ba4c-bab3fb71ae8e
SamAccountName : DC01$
SID : S-1-5-21-2989741381-570885089-3319121794-1001
UserPrincipalName :
DistinguishedName : CN=WEB01,CN=Computers,DC=mikefrobbins,DC=com
DNSHostName : web01.mikefrobbins.com
Enabled : True
Name : WEB01
ObjectClass : computer
ObjectGUID : 33aa530e-1e31-40d8-8c78-76a18b673c33
SamAccountName : WEB01$
SID : S-1-5-21-2989741381-570885089-3319121794-1107
UserPrincipalName :
Sering kali perulangan seperti foreach atau ForEach-Object diperlukan. Jika tidak, Anda menerima pesan kesalahan.
Get-ADComputer -Identity 'DC01', 'WEB01'
Get-ADComputer : Cannot convert 'System.Object[]' to the type
'Microsoft.ActiveDirectory.Management.ADComputer' required by parameter
'Identity'. Specified method is not supported.
At line:1 char:26
+ Get-ADComputer -Identity 'DC01', 'WEB01'
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-ADComputer], Parame
terBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirecto
ry.Management.Commands.GetADComputer
Kadang-kadang, Anda bisa mendapatkan hasil yang sama sambil menghapus perulangan. Gunakan bantuan cmdlet untuk memahami opsi Anda.
'DC01', 'WEB01' | Get-ADComputer
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=mikefrobbins,DC=com
DNSHostName : dc01.mikefrobbins.com
Enabled : True
Name : DC01
ObjectClass : computer
ObjectGUID : c38da20c-a484-469d-ba4c-bab3fb71ae8e
SamAccountName : DC01$
SID : S-1-5-21-2989741381-570885089-3319121794-1001
UserPrincipalName :
DistinguishedName : CN=WEB01,CN=Computers,DC=mikefrobbins,DC=com
DNSHostName : web01.mikefrobbins.com
Enabled : True
Name : WEB01
ObjectClass : computer
ObjectGUID : 33aa530e-1e31-40d8-8c78-76a18b673c33
SamAccountName : WEB01$
SID : S-1-5-21-2989741381-570885089-3319121794-1107
UserPrincipalName :
Seperti yang Anda lihat dalam contoh sebelumnya, parameter Identitas untuk Get-ADComputer hanya menerima satu nilai saat disediakan melalui input parameter. Namun, dengan menggunakan alur, Anda dapat mengirim beberapa nilai ke perintah karena nilai diproses satu per satu.
Bagi
Sebuah for loop beriterasi saat kondisi yang ditentukan benar. Saya tidak sering menggunakan perulangan for, tetapi ada manfaatnya.
for ($i = 1; $i -lt 5; $i++) {
Write-Output "Sleeping for $i seconds"
Start-Sleep -Seconds $i
}
Sleeping for 1 seconds
Sleeping for 2 seconds
Sleeping for 3 seconds
Sleeping for 4 seconds
Dalam contoh sebelumnya, perulangan berulang empat kali dengan memulai dengan nomor satu dan melanjutkan selama variabel $i penghitung kurang dari 5. Ia tidur selama total 10 detik.
Lakukan
Ada dua perulangan yang berbeda do di PowerShell: do until dan do while.
do until berjalan saat kondisi yang ditentukan adalah false.
Contoh berikut adalah permainan angka yang berlanjut sampai nilai yang Anda tebak sama dengan angka yang sama dengan Get-Random cmdlet yang dihasilkan.
$number = Get-Random -Minimum 1 -Maximum 10
do {
$guess = Read-Host -Prompt "What's your guess?"
if ($guess -lt $number) {
Write-Output 'Too low!'
} elseif ($guess -gt $number) {
Write-Output 'Too high!'
}
}
until ($guess -eq $number)
What's your guess?: 1
Too low!
What's your guess?: 2
Too low!
What's your guess?: 3
Do While adalah kebalikannya. Ini berfungsi selama kondisi yang ditentukan dievaluasi sebagai benar.
$number = Get-Random -Minimum 1 -Maximum 10
do {
$guess = Read-Host -Prompt "What's your guess?"
if ($guess -lt $number) {
Write-Output 'Too low!'
} elseif ($guess -gt $number) {
Write-Output 'Too high!'
}
}
while ($guess -ne $number)
What's your guess?: 1
Too low!
What's your guess?: 2
Too low!
What's your guess?: 3
Too low!
What's your guess?: 4
Hasil yang sama dicapai dengan loop Do While dengan membalikkan syarat pengujian agar tidak sama dengan.
do perulangan selalu berjalan setidaknya sekali karena kondisi dievaluasi di akhir perulangan.
Sedangkan
Seperti perulangan do while , perulangan while berjalan selama kondisi yang ditentukan benar. Perbedaannya, bagaimanapun, adalah bahwa perulangan while mengevaluasi kondisi di bagian atas perulangan sebelum kode apa pun dijalankan. Jadi, tidak berjalan jika kondisi dievaluasi sebagai false.
Contoh berikut menghitung hari berapa Hari Thanksgiving berada di Amerika Serikat. Ini selalu pada hari Kamis keempat November. Perulangan dimulai dengan hari ke-22 November dan menambahkan hari, sementara hari dalam seminggu tidak sama dengan Hari Kamis. Jika tanggal 22 adalah hari Kamis, loop tidak berjalan sama sekali.
$date = Get-Date -Date 'November 22'
while ($date.DayOfWeek -ne 'Thursday') {
$date = $date.AddDays(1)
}
Write-Output $date
Thursday, November 23, 2017 12:00:00 AM
Perhentian, lanjutkan, dan kembali
Keyword break dirancang untuk keluar dari loop dan sering digunakan dengan statement switch. Dalam contoh berikut, break menyebabkan perulangan berakhir setelah iterasi pertama.
for ($i = 1; $i -lt 5; $i++) {
Write-Output "Sleeping for $i seconds"
Start-Sleep -Seconds $i
break
}
Sleeping for 1 seconds
Kata kunci continue dirancang untuk melewati iterasi selanjutnya dari sebuah loop.
Contoh berikut menghasilkan angka 1, 2, 4, dan 5. Program ini melewati angka 3 dan melanjutkan dengan iterasi selanjutnya dari loop. Seperti break, continue keluar dari perulangan kecuali hanya untuk iterasi saat ini. Eksekusi berlanjut dengan iterasi berikutnya, bukannya keluar sepenuhnya dari perulangan dan berhenti.
while ($i -lt 5) {
$i += 1
if ($i -eq 3) {
continue
}
Write-Output $i
}
1
2
4
5
Kata kunci return dirancang untuk keluar dari lingkup yang ada.
Perhatikan dalam contoh berikut yang return menghasilkan hasil pertama lalu keluar dari perulangan.
$number = 1..10
foreach ($n in $number) {
if ($n -ge 4) {
return $n
}
}
4
Penjelasan yang lebih menyeluruh tentang pernyataan hasil dapat ditemukan di salah satu artikel blog saya: Kata kunci pengembalian PowerShell.
Ringkasan
Dalam bab ini, Anda mempelajari tentang berbagai jenis perulangan yang ada di PowerShell.
Tinjauan
- Apa perbedaan antara
ForEach-Objectcmdlet danforeachpernyataan? - Apa keuntungan utama menggunakan perulangan
whilealih-alih perulangando whileataudo until? - Bagaimana pernyataan
breakdancontinueberbeda?
Untuk jawaban atas pertanyaan ulasan, lihat Lampiran buku ini.
Referensi
- ForEach-Object (UntukSetiap-Objek)
- tentang_Foreach
- tentang_Untuk
- tentang_Lakukan
- tentang_While
- tentang_Jeda
- tentang_Lanjutkan
- tentang_Pengembalian
Langkah selanjutnya
Di Bab 7, Anda akan mempelajari cara mengambil dan bekerja dengan informasi sistem menggunakan Windows Management Instrumentation (WMI) dan Common Information Model (CIM). Anda akan menjelajahi cmdlet berbasis CIM modern, memahami perbedaannya dengan perintah WMI warisan, dan menggunakannya untuk mengkueri sistem lokal dan jarak jauh secara efisien.