Bagikan melalui


Semua yang ingin Anda ketahui tentang if pernyataan

Seperti banyak bahasa lain, PowerShell memiliki pernyataan untuk mengeksekusi kode secara kondisional dalam skrip Anda. Salah satu pernyataan tersebut adalah pernyataan If . Hari ini kita akan mendalami salah satu perintah paling mendasar di PowerShell.

Catatan

Versi asli artikel ini muncul di blog yang ditulis oleh @KevinMarquette. Tim PowerShell berterima kasih kepada Kevin karena telah membagikan konten ini kepada kami. Silakan lihat blognya di PowerShellExplained.com.

Eksekusi bersyarah

Skrip Anda sering kali perlu membuat keputusan dan melakukan logika yang berbeda berdasarkan keputusan tersebut. Inilah yang kumaksudkan dengan eksekusi kondisional. Anda memiliki satu pernyataan atau nilai untuk dievaluasi, lalu menjalankan bagian kode yang berbeda berdasarkan evaluasi tersebut. Inilah yang dilakukan oleh pernyataan tersebut if .

Pernyataan if

Berikut adalah contoh if dasar pernyataan:

$condition = $true
if ( $condition )
{
    Write-Output "The condition was true"
}

Hal pertama yang if dilakukan pernyataan adalah mengevaluasi ekspresi dalam tanda kurung. Jika dievaluasi ke $true, maka ia mengeksekusi scriptblock dalam kurung kurawal. Jika nilainya adalah $false, maka nilai tersebut akan melewati blokir skrip tersebut.

Dalam contoh sebelumnya, if pernyataan hanya mengevaluasi $condition variabel. Itu dan $true akan menjalankan perintah di Write-Output dalam blok skrip.

Dalam beberapa bahasa, Anda dapat menempatkan satu baris kode setelah if pernyataan dan dieksekusi. Bukan itu masalahnya di PowerShell. Anda harus menyediakan kurung kurawal penuh scriptblock agar berfungsi dengan benar.

Operator perbandingan

Penggunaan pernyataan yang if paling umum adalah membandingkan dua item satu sama lain. PowerShell memiliki operator khusus untuk skenario perbandingan yang berbeda. Saat Anda menggunakan operator perbandingan, nilai di sisi kiri dibandingkan dengan nilai di sisi kanan.

-eq untuk kesetaraan

-eq melakukan pemeriksaan kesetaraan antara dua nilai untuk memastikan keduanya sama satu sama lain.

$value = Get-MysteryValue
if ( 5 -eq $value )
{
    # do something
}

Dalam contoh ini, saya mengambil nilai 5 yang diketahui dan membandingkannya dengan saya $value untuk melihat apakah mereka cocok.

Salah satu kemungkinan kasus penggunaan adalah memeriksa status nilai sebelum Anda mengambil tindakan di atasnya. Anda bisa mendapatkan layanan dan memeriksa apakah status berjalan sebelum Anda memanggilnya Restart-Service .

Umum dalam bahasa lain seperti C# untuk digunakan == untuk kesetaraan (misalnya: 5 == $value) tetapi itu tidak berfungsi dengan PowerShell. Kesalahan umum lain yang dilakukan orang adalah menggunakan tanda sama dengan (misalnya: 5 = $value) yang dicadangkan untuk menetapkan nilai ke variabel. Dengan menempatkan nilai Anda yang diketahui di sebelah kiri, itu membuat kesalahan itu lebih canggung untuk dibuat.

Operator ini (dan lainnya) memiliki beberapa variasi.

  • -eq kesetaraan tidak peka huruf besar/kecil
  • -ieq kesetaraan tidak peka huruf besar/kecil
  • -ceq kesetaraan peka huruf besar/kecil

-ne tidak sama

Banyak operator memiliki operator terkait yang memeriksa hasil yang berlawanan. -ne memverifikasi bahwa nilai tidak sama satu sama lain.

if ( 5 -ne $value )
{
    # do something
}

Gunakan ini untuk memastikan bahwa tindakan hanya dijalankan jika nilainya bukan 5. Kasus penggunaan yang baik di mana akan memeriksa apakah layanan dalam status berjalan sebelum Anda mencoba memulainya.

Variasi:

  • -ne tidak peka huruf besar/kecil tidak sama
  • -ine tidak peka huruf besar/kecil tidak sama
  • -cne peka huruf besar/kecil tidak sama

Ini adalah variasi terbalik dari -eq. Saya akan mengelompokkan jenis ini bersama-sama ketika saya mencantumkan variasi untuk operator lain.

-gt -ge -lt -le untuk lebih besar dari atau kurang dari

Operator ini digunakan saat memeriksa untuk melihat apakah nilai lebih besar atau lebih kecil dari nilai lain. Singkatan -gt -ge -lt -le dari GreaterThan, GreaterThanOrEqual, LessThan, dan LessThanOrEqual.

if ( $value -gt 5 )
{
    # do something
}

Variasi:

  • -gt lebih besar dari
  • -igt lebih besar dari, tidak peka huruf besar/kecil
  • -cgt lebih besar dari, peka huruf besar/kecil
  • -ge lebih besar dari atau sama dengan
  • -ige lebih besar dari atau sama dengan, tidak peka huruf besar/kecil
  • -cge lebih besar dari atau sama dengan, peka huruf besar/kecil
  • -lt Kurang
  • -ilt kurang dari, tidak peka huruf besar/kecil
  • -clt kurang dari, peka huruf besar/kecil
  • -le kurang dari atau sama dengan
  • -ile kurang dari atau sama dengan, tidak peka huruf besar/kecil
  • -cle kurang dari atau sama dengan, peka huruf besar/kecil

Saya tidak tahu mengapa Anda akan menggunakan opsi peka huruf besar/kecil dan tidak sensitif untuk operator ini.

-seperti kecocokan kartubebas

PowerShell memiliki sintaks pencocokan pola berbasis kartubebas sendiri dan Anda dapat menggunakannya dengan -like operator. Pola kartubebas ini cukup mendasar.

  • ? mencocokkan karakter tunggal apa pun
  • * cocok dengan sejumlah karakter
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
    # do something
}

Penting untuk menunjukkan bahwa pola cocok dengan seluruh string. Jika Anda perlu mencocokkan sesuatu di tengah string, Anda perlu menempatkan * di kedua ujung string.

$value = 'S-ATX-SQL02'
if ( $value -like '*SQL*')
{
    # do something
}

Variasi:

  • -like kartubebas yang tidak peka huruf besar/kecil
  • -ilike kartubebas yang tidak peka huruf besar/kecil
  • -clike kartubebas peka huruf besar/kecil
  • -notlike kartubebas tidak peka huruf besar/kecil tidak cocok
  • -inotlike kartubebas tidak peka huruf besar/kecil tidak cocok
  • -cnotlike kartubebas peka huruf besar/kecil tidak cocok

-cocokkan ekspresi reguler

Operator -match memungkinkan Anda memeriksa string untuk kecocokan berbasis ekspresi reguler. Gunakan ini ketika pola kartubebas tidak cukup fleksibel untuk Anda.

$value = 'S-ATX-SQL01'
if ( $value -match 'S-\w\w\w-SQL\d\d')
{
    # do something
}

Pola regex cocok di mana saja dalam string secara default. Jadi Anda dapat menentukan substring yang ingin Anda cocokkan seperti ini:

$value = 'S-ATX-SQL01'
if ( $value -match 'SQL')
{
    # do something
}

Regex adalah bahasa yang kompleks dari bahasanya sendiri dan layak dilihat. Saya berbicara lebih banyak tentang -match dan banyak cara untuk menggunakan regex di artikel lain.

Variasi:

  • -match regex tidak peka huruf besar/kecil
  • -imatch regex tidak peka huruf besar/kecil
  • -cmatch regex peka huruf besar/kecil
  • -notmatch regex tidak peka huruf besar/kecil tidak cocok
  • -inotmatch regex tidak peka huruf besar/kecil tidak cocok
  • -cnotmatch regex peka huruf besar/kecil tidak cocok

-is dari jenis

Anda dapat memeriksa jenis nilai dengan -is operator.

if ( $value -is [string] )
{
    # do something
}

Anda dapat menggunakan ini jika Anda bekerja dengan kelas atau menerima berbagai objek melalui alur. Anda dapat memiliki layanan atau nama layanan sebagai input Anda. Kemudian periksa untuk melihat apakah Anda memiliki layanan dan mengambil layanan jika Anda hanya memiliki nama.

if ( $Service -isnot [System.ServiceProcess.ServiceController] )
{
    $Service = Get-Service -Name $Service
}

Variasi:

  • -is jenis
  • -isnot bukan tipe

Operator koleksi

Saat Anda menggunakan operator sebelumnya dengan satu nilai, hasilnya adalah $true atau $false. Ini ditangani sedikit berbeda saat bekerja dengan koleksi. Setiap item dalam koleksi dievaluasi dan operator mengembalikan setiap nilai yang dievaluasi ke $true.

PS> 1,2,3,4 -eq 3
3

Ini masih berfungsi dengan benar dalam pernyataan if . Jadi nilai dikembalikan oleh operator Anda, maka seluruh pernyataannya adalah $true.

$array = 1..6
if ( $array -gt 3 )
{
    # do something
}

Ada satu jebakan kecil bersembunyi dalam rincian di sini bahwa saya perlu menunjukkan. Saat menggunakan operator dengan -ne cara ini, mudah untuk secara keliru melihat logika mundur. Menggunakan -ne dengan koleksi mengembalikan $true jika ada item dalam koleksi yang tidak cocok dengan nilai Anda.

PS> 1,2,3 -ne 4
1
2
3

Ini mungkin terlihat seperti trik cerdas, tetapi kami memiliki operator -contains dan -in yang menangani ini lebih efisien. Dan -notcontains melakukan apa yang Anda harapkan.

-contains

Operator -contains memeriksa koleksi untuk nilai Anda. Segera setelah menemukan kecocokan, ia mengembalikan $true.

$array = 1..6
if ( $array -contains 3 )
{
    # do something
}

Ini adalah cara yang disukai untuk melihat apakah koleksi berisi nilai Anda. Menggunakan Where-Object (atau -eq) memandu seluruh daftar setiap kali dan secara signifikan lebih lambat.

Variasi:

  • -contains kecocokan tidak peka huruf besar/kecil
  • -icontains kecocokan tidak peka huruf besar/kecil
  • -ccontains kecocokan peka huruf besar/kecil
  • -notcontains tidak peka huruf besar/kecil tidak cocok
  • -inotcontains tidak peka huruf besar/kecil tidak cocok
  • -cnotcontains peka huruf besar/kecil tidak cocok

-in

Operator -in sama seperti -contains operator kecuali koleksi berada di sisi kanan.

$array = 1..6
if ( 3 -in $array )
{
    # do something
}

Variasi:

  • -in kecocokan tidak peka huruf besar/kecil
  • -iin kecocokan tidak peka huruf besar/kecil
  • -cin kecocokan peka huruf besar/kecil
  • -notin tidak peka huruf besar/kecil tidak cocok
  • -inotin tidak peka huruf besar/kecil tidak cocok
  • -cnotin peka huruf besar/kecil tidak cocok

Operator logis

Operator logis digunakan untuk menginversi atau menggabungkan ekspresi lain.

-Tidak

Operator -not membalikkan ekspresi dari $false ke $true atau dari $true ke $false. Berikut adalah contoh di mana kita ingin melakukan tindakan ketika Test-Path adalah $false.

if ( -not ( Test-Path -Path $path ) )

Sebagian besar operator yang kami bicarakan memang memiliki variasi di mana Anda tidak perlu menggunakan -not operator. Tetapi masih ada kalanya berguna.

! operator

Anda dapat menggunakan ! sebagai alias untuk -not.

if ( -not $value ){}
if ( !$value ){}

Anda mungkin melihat ! lebih banyak digunakan oleh orang-orang yang berasal dari bahasa lain seperti C#. Saya lebih suka mengetiknya karena saya merasa sulit untuk melihat ketika dengan cepat melihat skrip saya.

-and

Anda dapat menggabungkan ekspresi dengan -and operator. Ketika Anda melakukan itu, kedua belah pihak harus untuk $true seluruh ekspresi menjadi $true.

if ( ($age -gt 13) -and ($age -lt 55) )

Dalam contoh itu, $age harus 13 atau lebih lama untuk sisi kiri dan kurang dari 55 untuk sisi kanan. Saya menambahkan tanda kurung tambahan untuk membuatnya lebih jelas dalam contoh itu tetapi bersifat opsional selama ekspresinya sederhana. Berikut adalah contoh yang sama tanpa mereka.

if ( $age -gt 13 -and $age -lt 55 )

Evaluasi terjadi dari kiri ke kanan. Jika item pertama dievaluasi ke $false, item keluar lebih awal dan tidak melakukan perbandingan yang tepat. Ini berguna ketika Anda perlu memastikan ada nilai sebelum Anda menggunakannya. Misalnya, Test-Path melemparkan kesalahan jika Anda memberinya $null jalur.

if ( $null -ne $path -and (Test-Path -Path $path) )

-or

memungkinkan -or Anda menentukan dua ekspresi dan mengembalikan $true jika salah satunya adalah $true.

if ( $age -le 13 -or $age -ge 55 )

Sama seperti operator -and , evaluasi terjadi dari kiri ke kanan. Kecuali bahwa jika bagian pertama adalah $true, maka seluruh pernyataan adalah $true dan tidak memproses sisa ekspresi.

Catat juga cara kerja sintaks untuk operator ini. Anda memerlukan dua ekspresi terpisah. Saya telah melihat pengguna mencoba melakukan sesuatu seperti ini $value -eq 5 -or 6 tanpa menyadari kesalahan mereka.

-xor eksklusif atau

Yang satu ini sedikit tidak biasa. -xor hanya memungkinkan satu ekspresi untuk mengevaluasi ke $true. Jadi jika kedua item adalah $false atau kedua item adalah $true, maka seluruh ekspresinya adalah $false. Cara lain untuk melihat ini adalah ekspresi hanya $true ketika hasil ekspresi berbeda.

Sangat jarang bahwa siapa pun akan pernah menggunakan operator logis ini dan saya tidak bisa memikirkan contoh yang baik mengapa saya pernah menggunakannya.

Operator bitwise

Operator bitwise melakukan perhitungan pada bit dalam nilai dan menghasilkan nilai baru sebagai hasilnya. Mengajar operator bitwise berada di luar cakupan artikel ini, tetapi berikut adalah daftarnya.

  • -band biner DAN
  • -bor biner ATAU
  • -bxor biner eksklusif OR
  • -bnot biner NOT
  • -shl geser ke kiri
  • -shr geser ke kanan

Ekspresi PowerShell

Kita dapat menggunakan PowerShell normal di dalam pernyataan kondisi.

if ( Test-Path -Path $Path )

Test-Path$true mengembalikan atau $false ketika dijalankan. Ini juga berlaku untuk perintah yang mengembalikan nilai lain.

if ( Get-Process Notepad* )

Ini mengevaluasi ke $true jika ada proses yang dikembalikan dan $false jika tidak ada. Sangat valid untuk menggunakan ekspresi alur atau pernyataan PowerShell lainnya seperti ini:

if ( Get-Process | Where Name -eq Notepad )

Ekspresi ini dapat dikombinasikan satu sama lain dengan -and operator dan -or , tetapi Anda mungkin harus menggunakan tanda kurung untuk memecahnya menjadi subekspresi.

if ( (Get-Process) -and (Get-Service) )

Memeriksa $null

Tidak memiliki hasil atau nilai yang $null dievaluasi $false dalam if pernyataan. Saat memeriksa khusus untuk $null, ini adalah praktik terbaik untuk menempatkan $null di sisi kiri.

if ( $null -eq $value )

Ada beberapa nuansa saat berhadapan dengan $null nilai di PowerShell. Jika Anda tertarik untuk menyelam lebih dalam, saya memiliki artikel tentang semua yang ingin Anda ketahui tentang $null.

Penetapan variabel dalam kondisi

Aku hampir lupa menambahkan ini sampai Prasoon Karunan V mengingatkanku akan hal itu.

if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}

Biasanya saat Anda menetapkan nilai ke variabel, nilai tidak diteruskan ke alur atau konsol. Saat Anda melakukan penetapan variabel dalam sub ekspresi, itu akan diteruskan ke alur.

PS> $first = 1
PS> ($second = 2)
2

Lihat bagaimana $first penugasan tidak memiliki output dan $second penugasan? Ketika penugasan dilakukan dalam pernyataan if , tugas dijalankan sama seperti penugasan di $second atas. Berikut adalah contoh yang bersih tentang bagaimana Anda dapat menggunakannya:

if ( $process = Get-Process Notepad* )
{
    $process | Stop-Process
}

Jika $process diberi nilai, maka pernyataannya adalah $true dan $process dihentikan.

Pastikan Anda tidak membingungkan ini karena -eq ini bukan pemeriksaan kesetaraan. Ini adalah fitur yang lebih tidak jelas yang tidak disadari kebanyakan orang bekerja dengan cara ini.

Penetapan variabel dari blok skrip

Anda juga dapat menggunakan if blokir skrip pernyataan untuk menetapkan nilai ke variabel.

$discount = if ( $age -ge 55 )
{
    Get-SeniorDiscount
}
elseif ( $age -le 13 )
{
    Get-ChildDiscount
}
else
{
    0.00
}

Setiap blok skrip menulis hasil perintah, atau nilai, sebagai output. Kita dapat menetapkan hasil if pernyataan ke $discount variabel . Contoh itu bisa saja dengan mudah menetapkan nilai-nilai tersebut ke $discount variabel langsung di setiap blok skrip. Saya tidak bisa mengatakan bahwa saya sering menggunakan ini dengan if pernyataan, tetapi saya memiliki contoh di mana saya menggunakan ini baru-baru ini.

Jalur eksekusi alternatif

Pernyataan ini if memungkinkan Anda menentukan tindakan untuk tidak hanya ketika pernyataan adalah $true, tetapi juga ketika itu $falseadalah . Di sinilah pernyataan datang else ke dalam bermain.

else

Pernyataan else selalu merupakan bagian terakhir dari if pernyataan saat digunakan.

if ( Test-Path -Path $Path -PathType Leaf )
{
    Move-Item -Path $Path -Destination $archivePath
}
else
{
    Write-Warning "$path doesn't exist or isn't a file."
}

Dalam contoh ini, kami memeriksa $path untuk memastikan itu adalah file. Jika kita menemukan file, kita memindahkannya. Jika tidak, kami menulis peringatan. Jenis logika percabangan ini sangat umum.

Berlapis jika

Pernyataan if dan else mengambil blok skrip, sehingga kita dapat menempatkan perintah PowerShell di dalamnya, termasuk pernyataan lain if . Ini memungkinkan Anda untuk menggunakan logika yang jauh lebih rumit.

if ( Test-Path -Path $Path -PathType Leaf )
{
    Move-Item -Path $Path -Destination $archivePath
}
else
{
    if ( Test-Path -Path $Path )
    {
        Write-Warning "A file was required but a directory was found instead."
    }
    else
    {
        Write-Warning "$path could not be found."
    }
}

Dalam contoh ini, kita menguji jalur bahagia terlebih dahulu dan kemudian mengambil tindakan di atasnya. Jika gagal, kami melakukan pemeriksaan lain dan untuk memberikan informasi yang lebih rinci kepada pengguna.

elseif

Kami tidak terbatas hanya pada satu pemeriksaan kondisional. Kita dapat menautkan if dan else pernyataan bersama-sama alih menyarangkannya dengan menggunakan pernyataan .elseif

if ( Test-Path -Path $Path -PathType Leaf )
{
    Move-Item -Path $Path -Destination $archivePath
}
elseif ( Test-Path -Path $Path )
{
    Write-Warning "A file was required but a directory was found instead."
}
else
{
    Write-Warning "$path could not be found."
}

Eksekusi terjadi dari atas ke bawah. Pernyataan teratas if dievaluasi terlebih dahulu. Jika itu adalah $false, maka ia berpindah ke bawah ke daftar berikutnya elseif atau else dalam daftar. Yang terakhir else adalah tindakan default yang harus diambil jika tidak ada yang mengembalikan $true.

beralih

Pada titik ini, saya perlu menyebutkan switch pernyataan. Ini menyediakan sintaks alternatif untuk melakukan beberapa perbandingan dengan nilai. switchDengan , Anda menentukan ekspresi dan hasil tersebut dibandingkan dengan beberapa nilai yang berbeda. Jika salah satu nilai tersebut cocok, blok kode yang cocok dijalankan. Lihat contoh ini:

$itemType = 'Role'
switch ( $itemType )
{
    'Component'
    {
        'is a component'
    }
    'Role'
    {
        'is a role'
    }
    'Location'
    {
        'is a location'
    }
}

Ada tiga kemungkinan nilai yang dapat cocok dengan $itemType. Dalam hal ini, cocok dengan Role. Saya menggunakan contoh sederhana hanya untuk memberi Anda beberapa paparan ke switch operator. Saya berbicara lebih banyak tentang semua yang ingin Anda ketahui tentang pernyataan switch di artikel lain.

Array sebaris

Saya memiliki fungsi yang disebut Invoke-SnowSql yang meluncurkan executable dengan beberapa argumen baris perintah. Berikut adalah klip dari fungsi tersebut di mana saya membangun array argumen.

$snowSqlParam = @(
    '--accountname', $Endpoint
    '--username', $Credential.UserName
    '--option', 'exit_on_error=true'
    '--option', 'output_format=csv'
    '--option', 'friendly=false'
    '--option', 'timing=false'
    if ($Debug)
    {
        '--option', 'log_level=DEBUG'
    }
    if ($Path)
    {
        '--filename', $Path
    }
    else
    {
        '--query', $singleLineQuery
    }
)

Variabel $Debug dan $Path adalah parameter pada fungsi yang disediakan oleh pengguna akhir. Saya mengevaluasinya sebaris di dalam inisialisasi array saya. Jika $Debug benar, maka nilai-nilai tersebut berada di tempat yang $snowSqlParam benar. Hal yang sama berlaku untuk $Path variabel.

Menyederhanakan operasi yang kompleks

Tidak dapat dihindari bahwa Anda mengalami situasi yang memiliki terlalu banyak perbandingan untuk diperiksa dan pernyataan Anda If menggulir jauh dari sisi kanan layar.

$user = Get-ADUser -Identity $UserName
if ( $null -ne $user -and $user.Department -eq 'Finance' -and $user.Title -match 'Senior' -and $user.HomeDrive -notlike '\\server\*' )
{
    # Do Something
}

Mereka bisa sulit dibaca dan itu membuat Anda lebih rentan untuk membuat kesalahan. Ada beberapa hal yang bisa kita lakukan tentang itu.

Kelanjutan baris

Ada beberapa operator di PowerShell yang memungkinkan Anda membungkus perintah Anda ke baris berikutnya. Operator -and logis dan -or merupakan operator yang baik untuk digunakan jika Anda ingin memecah ekspresi Anda menjadi beberapa baris.

if ($null -ne $user -and
    $user.Department -eq 'Finance' -and
    $user.Title -match 'Senior' -and
    $user.HomeDrive -notlike '\\server\*'
)
{
    # Do Something
}

Masih banyak yang terjadi di sana, tetapi menempatkan setiap bagian pada barisnya sendiri membuat perbedaan besar. Saya umumnya menggunakan ini ketika saya mendapatkan lebih dari dua perbandingan atau jika saya harus menggulir ke kanan untuk membaca salah satu logika.

Hasil pra-perhitungan

Kita dapat mengambil pernyataan itu if dari pernyataan dan hanya memeriksa hasilnya.

$needsSecureHomeDrive = $null -ne $user -and
    $user.Department -eq 'Finance' -and
    $user.Title -match 'Senior' -and
    $user.HomeDrive -notlike '\\server\*'

if ( $needsSecureHomeDrive )
{
    # Do Something
}

Ini hanya terasa jauh lebih bersih daripada contoh sebelumnya. Anda juga diberi kesempatan untuk menggunakan nama variabel yang menjelaskan apa yang benar-benar Anda periksa. Ini juga dan contoh kode dokumentasi mandiri yang menyimpan komentar yang tidak perlu.

Beberapa pernyataan jika

Kita dapat memecah ini menjadi beberapa pernyataan dan memeriksanya satu per satu. Dalam hal ini, kami menggunakan bendera atau variabel pelacakan untuk menggabungkan hasilnya.


$skipUser = $false

if( $null -eq $user )
{
    $skipUser = $true
}

if( $user.Department -ne 'Finance' )
{
    Write-Verbose "isn't in Finance department"
    $skipUser = $true
}

if( $user.Title -match 'Senior' )
{
    Write-Verbose "Doesn't have Senior title"
    $skipUser = $true
}

if( $user.HomeDrive -like '\\server\*' )
{
    Write-Verbose "Home drive already configured"
    $skipUser = $true
}

if ( -not $skipUser )
{
    # do something
}

Saya memang harus membalikkan logika untuk membuat logika bendera berfungsi dengan benar. Setiap evaluasi adalah pernyataan individu if . Keuntungan dari ini adalah bahwa ketika Anda men-debug, Anda dapat mengetahui dengan tepat apa yang dilakukan logika. Saya dapat menambahkan verbositas yang jauh lebih baik pada saat yang sama.

Kelemahan yang jelas adalah bahwa itu jauh lebih banyak kode untuk ditulis. Kode ini lebih kompleks untuk dilihat karena membutuhkan satu baris logika dan meledakkannya menjadi 25 baris atau lebih.

Menggunakan fungsi

Kita juga dapat memindahkan semua logika validasi tersebut ke dalam fungsi. Lihatlah sekilas bagaimana ini terlihat bersih.

if ( Test-SecureDriveConfiguration -ADUser $user )
{
    # do something
}

Anda masih harus membuat fungsi untuk melakukan validasi, tetapi membuat kode ini jauh lebih mudah untuk dikerjakan. Ini membuat kode ini lebih mudah diuji. Dalam pengujian, Anda dapat meniru panggilan dan Test-ADDriveConfiguration Anda hanya memerlukan dua tes untuk fungsi ini. Satu di mana ia kembali $true dan satu di mana ia mengembalikan $false. Menguji fungsi lain lebih sederhana karena sangat kecil.

Isi fungsi itu masih bisa menjadi bahwa satu liner yang kita mulai dengan atau logika meledak yang kita gunakan di bagian terakhir. Ini berfungsi dengan baik untuk kedua skenario dan memungkinkan Anda untuk dengan mudah mengubah implementasi tersebut nanti.

Penanganan kesalahan

Salah satu penggunaan penting dari if pernyataan ini adalah memeriksa kondisi kesalahan sebelum Anda mengalami kesalahan. Contoh yang baik adalah memeriksa apakah folder sudah ada sebelum Anda mencoba membuatnya.

if ( -not (Test-Path -Path $folder) )
{
    New-Item -Type Directory -Path $folder
}

Saya ingin mengatakan bahwa jika Anda mengharapkan pengecualian terjadi, maka itu tidak benar-benar pengecualian. Jadi, periksa nilai Anda dan validasi kondisi Anda di mana Anda bisa.

Jika Anda ingin menyelam sedikit lebih ke penanganan pengecualian yang sebenarnya, saya memiliki artikel tentang semua yang ingin Anda ketahui tentang pengecualian.

Kata-kata akhir

Pernyataan tersebut if adalah pernyataan sederhana tetapi merupakan bagian mendasar dari PowerShell. Anda akan menemukan diri Anda menggunakan ini beberapa kali di hampir setiap skrip yang Anda tulis. Kuharap kau punya pemahaman yang lebih baik dari sebelumnya.