If ifadesi hakkında bilmek istediğiniz her şey
Diğer birçok dilde olduğu gibi PowerShell'in de komut dosyalarınızda koşullu olarak kod yürütmeye yönelik ifadeleri vardır. Bu ifadelerden biri If ifadesidir. Bugün PowerShell'deki en temel komutlardan birine derinlemesine bakacağız.
Not
Bu makalenin orijinal versiyonu @KevinMarquette tarafından yazılan blogda yayınlandı. PowerShell ekibi bu içeriği bizimle paylaştığı için Kevin'e teşekkür ediyor. Lütfen PowerShellExplained.com adresindeki bloguna göz atın.
Koşullu yürütme
Komut dosyalarınızın sıklıkla kararlar alması ve bu kararlara göre farklı mantık yürütmesi gerekir. Koşullu infazdan kastım budur. Değerlendirilecek bir ifadeniz veya değeriniz var, ardından bu değerlendirmeye göre kodun farklı bir bölümünü yürütün. if ifadesinin yaptığı da tam olarak budur.
if ifadesi
Aşağıda if ifadesinin temel bir örneği verilmiştir:
$condition = $true
if ( $condition )
{
Write-Output "The condition was true"
}
if ifadesinin yaptığı ilk şey parantez içindeki ifadeyi değerlendirmektir. Eğer $true olarak değerlendirilirse, parantez içindeki scriptblock'u çalıştırır. Değer $false olsaydı, bu komut dosyası bloğunu atlardı.
Önceki örnekte, if ifadesi yalnızca $condition değişkenini değerlendiriyordu. Bu $true'du ve komut dosyası bloğunun içinde Write-Output komutunu çalıştırırdı.
Bazı dillerde, if deyiminden sonra tek satırlık bir kod yerleştirebilirsiniz ve bu kod çalıştırılır. PowerShell'de durum böyle değil. Düzgün çalışması için kaşlı ayraçlarla birlikte tam bir scriptblock sağlamanız gerekir.
Karşılaştırma operatörleri
if ifadesinin en yaygın kullanımı iki öğeyi birbiriyle karşılaştırmaktır. PowerShell'in farklı karşılaştırma senaryoları için özel operatörleri vardır. Bir karşılaştırma işleci kullandığınızda sol taraftaki değer, sağ taraftaki değerle karşılaştırılır.
eşitlik için -eq
-eq, birbirine eşit olduklarından emin olmak için iki değer arasında eşitlik kontrolü yapar.
$value = Get-MysteryValue
if ( 5 -eq $value )
{
# do something
}
Bu örnekte, bilinen bir 5 değerini alıyorum ve eşleşip eşleşmediklerini görmek için bunu $value değerim ile karşılaştırıyorum.
Olası bir kullanım durumu, bir değer üzerinde işlem yapmadan önce değerin durumunu kontrol etmektir. Bir hizmet alabilir ve Restart-Service'i çağırmadan önce durumun çalışıp çalışmadığını kontrol edebilirsiniz.
C# gibi diğer dillerde eşitlik için == kullanılması yaygındır (ör. 5 == $value), ancak bu PowerShell'de çalışmaz. İnsanların yaptığı bir diğer yaygın hata da değişkenlere değer atamak için ayrılan eşittir işaretini (ör. 5=$value) kullanmaktır. Bilinen değerinizi sola yerleştirmek, bu hatayı yapmayı daha da zorlaştırır.
Bu operatörün (ve diğerlerinin) birkaç çeşidi vardır.
-eqbüyük/küçük harfe duyarlı olmayan eşitlik-ieqbüyük/küçük harfe duyarlı olmayan eşitlik-ceqbüyük/küçük harfe duyarlı eşitlik
-ne eşit değil
Pek çok operatörün, ters sonucu kontrol eden ilgili bir operatörü vardır. -ne değerlerin birbirine eşit olmadığını doğrular.
if ( 5 -ne $value )
{
# do something
}
Eylemin yalnızca değer 5 olmadığında yürütüldüğünden emin olmak için bunu kullanın. Bir hizmetin, başlatmaya çalışmadan önce çalışır durumda olup olmadığının kontrol edilmesi iyi bir kullanım örneğidir.
Varyasyonlar:
-nebüyük/küçük harfe duyarlı değil eşit-inebüyük/küçük harfe duyarlı değil eşit-cnebüyük/küçük harfe duyarlı eşit değil
Bunlar -eq'in ters varyasyonlarıdır. Diğer operatörlerin varyasyonlarını listelerken bu türleri bir arada gruplayacağım.
-gt -ge -lt -le büyüktür veya küçüktür
Bu operatörler, bir değerin başka bir değerden büyük veya küçük olup olmadığını kontrol ederken kullanılır. -gt -ge -lt -le; GreaterThan, GreaterThanOrEqual, LessThan ve LessThanOrEqual anlamına gelir.
if ( $value -gt 5 )
{
# do something
}
Varyasyonlar:
-gtbüyüktür-igtbüyüktür, büyük/küçük harfe duyarlı değildir-cgtbüyüktür, büyük/küçük harfe duyarlıdır-gebüyük veya eşittir-igebüyük veya eşit, büyük/küçük harfe duyarlı değil-cgebüyük veya eşit, büyük/küçük harfe duyarlı-ltdaha az-iltküçük, büyük/küçük harfe duyarlı değil-cltküçük, büyük/küçük harfe duyarlı-leküçük veya eşit-ileküçük veya eşit, büyük/küçük harfe duyarlı değil-cleküçük veya eşit, büyük/küçük harfe duyarlı
Bu operatörler için neden büyük/küçük harfe duyarlı ve duyarsız seçenekleri kullandığınızı bilmiyorum.
-joker karakter eşleşmeleri gibi
PowerShell'in kendi joker karakter tabanlı kalıp eşleştirme söz dizimi vardır ve bunu -like operatörüyle kullanabilirsiniz. Bu joker karakter desenleri oldukça basittir.
?herhangi bir tek karakterle eşleşir*herhangi bir sayıda karakterle eşleşir
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
# do something
}
Desenin dizenin tamamıyla eşleştiğini belirtmek önemlidir. Dizenin ortasındaki bir şeyi eşleştirmeniz gerekiyorsa * işaretini dizenin her iki ucuna da yerleştirmeniz gerekir.
$value = 'S-ATX-SQL02'
if ( $value -like '*SQL*')
{
# do something
}
Varyasyonlar:
benzeribüyük/küçük harfe duyarlı olmayan joker karakter-ilikebüyük/küçük harfe duyarlı olmayan joker karakter-clikebüyük/küçük harfe duyarlı joker karakter-notlikebüyük/küçük harfe duyarlı olmayan joker karakter eşleşmedi-inotlikebüyük/küçük harfe duyarlı olmayan joker karakter eşleşmedi-cnotlikebüyük/küçük harfe duyarlı joker karakter eşleşmedi
-düzenli ifadeyle eşleş
-match operatörü, bir dizenin normal ifadeye dayalı bir eşleşme olup olmadığını kontrol etmenize olanak tanır. Joker karakter desenleri sizin için yeterince esnek olmadığında bunu kullanın.
$value = 'S-ATX-SQL01'
if ( $value -match 'S-\w\w\w-SQL\d\d')
{
# do something
}
Bir regex modeli varsayılan olarak dizenin herhangi bir yeri ile eşleşir. Böylece eşleşmesini istediğiniz bir alt dizeyi şu şekilde belirtebilirsiniz:
$value = 'S-ATX-SQL01'
if ( $value -match 'SQL')
{
# do something
}
Regex kendine has karmaşık bir dildir ve araştırılmaya değerdir. Başka bir makalede -match ve normal ifadeyi kullanmanın birçok yolu hakkında daha fazla konuşacağım.
Varyasyonlar:
-matchbüyük/küçük harfe duyarlı olmayan normal ifade-imatchbüyük/küçük harfe duyarlı olmayan normal ifade-cmatchbüyük/küçük harfe duyarlı normal ifade-notmatchbüyük/küçük harfe duyarlı olmayan normal ifade eşleşmedi-inotmatchbüyük/küçük harfe duyarlı olmayan normal ifade eşleşmedi-cnotmatchbüyük/küçük harfe duyarlı normal ifade eşleşmiyor
-tiptedir
Bir değerin türünü -is operatörüyle kontrol edebilirsiniz.
if ( $value -is [string] )
{
# do something
}
Sınıflarla çalışıyorsanız veya işlem hattı üzerinden çeşitli nesneleri kabul ediyorsanız bunu kullanabilirsiniz. Girişiniz olarak bir hizmete veya hizmet adına sahip olabilirsiniz. Daha sonra bir hizmetinizin olup olmadığını kontrol edin ve yalnızca adınız varsa hizmeti alın.
if ( $Service -isnot [System.ServiceProcess.ServiceController] )
{
$Service = Get-Service -Name $Service
}
Varyasyonlar:
-istüründedir-değiltürü değil
Tahsilat operatörleri
Önceki operatörleri tek bir değerle kullandığınızda sonuç $true veya $false olur. Bir koleksiyonla çalışırken bu biraz farklı şekilde ele alınır. Koleksiyondaki her öğe değerlendirilir ve operatör, $true olarak değerlendirilen her değeri döndürür.
PS> 1,2,3,4 -eq 3
3
Bu, if ifadesinde hala düzgün şekilde çalışıyor. Yani operatörünüz tarafından bir değer döndürülür, bu durumda ifadenin tamamı $true olur.
$array = 1..6
if ( $array -gt 3 )
{
# do something
}
Burada belirtmem gereken detaylarda küçük bir tuzak var. -ne operatörünü bu şekilde kullanırken, yanlışlıkla mantığa tersten bakmak kolaydır. Bir koleksiyonla -ne kullanmak, koleksiyondaki herhangi bir öğenin değerinizle eşleşmemesi durumunda $true değerini döndürür.
PS> 1,2,3 -ne 4
1
2
3
Bu akıllıca bir numara gibi görünebilir, ancak bunu daha verimli bir şekilde halledecek -contains ve -in operatörlerimiz var. Ve -notcontains beklediğinizi yapar.
-contains
-contains operatörü, koleksiyonda değeriniz olup olmadığını kontrol eder. Bir eşleşme bulur bulmaz $true değerini döndürür.
$array = 1..6
if ( $array -contains 3 )
{
# do something
}
Bu, bir koleksiyonun değerinizi içerip içermediğini görmenin tercih edilen yoludur. Nerede-Object (veya -eq) kullanıldığında listenin tamamında her zaman gezinilir ve önemli ölçüde daha yavaştır.
Varyasyonlar:
-içerirbüyük/küçük harfe duyarlı olmayan eşleşme-icontainsbüyük/küçük harfe duyarlı olmayan eşleşme-içeriyorbüyük/küçük harfe duyarlı eşleşme-notcontainsbüyük/küçük harfe duyarlı değil eşleşmedi-inotcontainsbüyük/küçük harfe duyarlı değil eşleşmedi-cnotcontainsbüyük/küçük harfe duyarlı eşleşmiyor
-in
-in operatörü, koleksiyonun sağ tarafta olması dışında, -contains operatörüne benzer.
$array = 1..6
if ( 3 -in $array )
{
# do something
}
Varyasyonlar:
-inbüyük/küçük harfe duyarlı olmayan eşleşme-iinbüyük/küçük harfe duyarlı olmayan eşleşme-cinbüyük/küçük harfe duyarlı eşleşme-notinbüyük/küçük harfe duyarlı değil-inotinbüyük/küçük harfe duyarlı değil-cnotinbüyük/küçük harfe duyarlı eşleşmiyor
Mantıksal operatörler
Mantıksal operatörler diğer ifadeleri tersine çevirmek veya birleştirmek için kullanılır.
-not
-not operatörü, bir ifadeyi $false'den $true'a veya $true'dan $'a çevirir yanlış. Aşağıda, Test-Path $false olduğunda bir eylem gerçekleştirmek istediğimiz bir örnek verilmiştir.
if ( -not ( Test-Path -Path $path ) )
Bahsettiğimiz operatörlerin çoğunun, -not operatörünü kullanmanıza gerek olmayan bir çeşidi vardır. Ama yine de faydalı olduğu zamanlar var.
! operatör
-not için takma ad olarak ! komutunu kullanabilirsiniz.
if ( -not $value ){}
if ( !$value ){}
!'ın C# gibi başka dillerden gelen kişiler tarafından daha çok kullanıldığını görebilirsiniz. Bunu yazmayı tercih ediyorum çünkü senaryolarıma hızlıca bakarken görmekte zorlanıyorum.
-and
İfadeleri -and operatörüyle birleştirebilirsiniz. Bunu yaptığınızda, ifadenin tamamının $true olması için her iki tarafın da $true olması gerekir.
if ( ($age -gt 13) -and ($age -lt 55) )
Bu örnekte, $age sol taraf için 13 yaşında veya daha büyük, sağ taraf için ise 55'ten küçük olmalıdır. Bu örnekte daha açık hale getirmek için fazladan parantez ekledim ancak ifade basit olduğu sürece bunlar isteğe bağlıdır. İşte onlarsız aynı örnek.
if ( $age -gt 13 -and $age -lt 55 )
Değerlendirme soldan sağa yapılır. İlk öğe $false olarak değerlendirilirse, erken çıkar ve doğru karşılaştırmayı gerçekleştirmez. Kullanmadan önce bir değerin var olduğundan emin olmanız gerektiğinde bu kullanışlıdır. Örneğin, Test-Path, kendisine bir $null yolu verirseniz hata verir.
if ( $null -ne $path -and (Test-Path -Path $path) )
-or
-or, iki ifade belirtmenize olanak tanır ve bunlardan herhangi biri $true ise $true değerini döndürür.
if ( $age -le 13 -or $age -ge 55 )
Tıpkı -and operatöründe olduğu gibi, değerlendirme soldan sağa doğru gerçekleşir. Ancak ilk kısım $true ise, o zaman ifadenin tamamı $true olur ve ifadenin geri kalanını işlemez.
Ayrıca bu operatörler için sözdiziminin nasıl çalıştığını da not edin. İki ayrı ifadeye ihtiyacınız var. Kullanıcıların hatalarını fark etmeden $value -eq 5 -or 6 gibi bir şey yapmaya çalıştıklarını gördüm.
-xor özel veya
Bu biraz sıradışı. -xor yalnızca bir ifadenin $true olarak değerlendirilmesine izin verir. Yani her iki öğe de $false ise veya her iki öğe de $true ise ifadenin tamamı $false olur. Buna bakmanın başka bir yolu da, ifadenin sonuçları farklı olduğunda ifadenin yalnızca $true olmasıdır.
Herhangi birinin bu mantıksal operatörü kullanması nadirdir ve bunu neden kullanacağıma dair iyi bir örnek aklıma gelmiyor.
Bitsel operatörler
Bitsel operatörler, değerlerin içindeki bitler üzerinde hesaplamalar yapar ve sonuç olarak yeni bir değer üretir. Bitsel operatörleri öğretmek bu makalenin kapsamı dışındadır, ancak bunların listesi aşağıdadır.
-bandikili VE-borikili VEYA-bxorikili özel VEYA-bnotikili DEĞİL-shlsola kaydır-shrsağa kaydır
PowerShell ifadeleri
Koşul ifadesinin içinde normal PowerShell'i kullanabiliriz.
if ( Test-Path -Path $Path )
Test-Path çalıştırıldığında $true veya $false değerini döndürür. Bu aynı zamanda diğer değerleri döndüren komutlar için de geçerlidir.
if ( Get-Process Notepad* )
Döndürülen bir işlem varsa $true olarak, yoksa $false olarak değerlendirilir. İşlem hattı ifadelerini veya bunun gibi diğer PowerShell ifadelerini kullanmak tamamen geçerlidir:
if ( Get-Process | Where Name -eq Notepad )
Bu ifadeler -and ve -or operatörleriyle birleştirilebilir, ancak bunları alt ifadelere ayırmak için parantez kullanmanız gerekebilir.
if ( (Get-Process) -and (Get-Service) )
$null olup olmadığı kontrol ediliyor
Sonuç olmaması veya $null değerinin olması, if ifadesinde $false olarak değerlendirilir. Özellikle $null'u kontrol ederken, $null'ı sol tarafa yerleştirmek en iyi uygulamadır.
if ( $null -eq $value )
PowerShell'de $null değerleriyle uğraşırken pek çok nüans vardır. Daha derine inmek istiyorsanız $null hakkında bilmek istediğiniz her şeyi anlatan bir makalem var.
Koşul içindeki değişken atama
Prasoon Karunan V bana hatırlatana kadar neredeyse bunu eklemeyi unutuyordum.
if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}
Normalde bir değişkene değer atadığınızda değer ardışık düzene veya konsola aktarılmaz. Bir alt ifadede değişken ataması yaptığınızda, bu işlem hattına aktarılır.
PS> $first = 1
PS> ($second = 2)
2
$first atamasının nasıl çıktısı olmadığını ve $second atamasının nasıl çıktısı olduğunu gördünüz mü? Bir if ifadesinde bir atama yapıldığında, yukarıdaki $second ataması gibi yürütülür. İşte bunu nasıl kullanabileceğinize dair temiz bir örnek:
if ( $process = Get-Process Notepad* )
{
$process | Stop-Process
}
$process'e bir değer atanırsa, ifade $true olur ve $process durdurulur.
Bunu -eq ile karıştırmadığınızdan emin olun çünkü bu bir eşitlik kontrolü değildir. Bu, çoğu insanın bu şekilde çalıştığını fark etmediği, daha belirsiz bir özelliktir.
Komut dosyası bloğundan değişken atama
Bir değişkene değer atamak için if ifadesi komut dosyası bloğunu da kullanabilirsiniz.
$discount = if ( $age -ge 55 )
{
Get-SeniorDiscount
}
elseif ( $age -le 13 )
{
Get-ChildDiscount
}
else
{
0.00
}
Her kod bloğu, komutların sonuçlarını veya değerini çıktı olarak yazıyor. if ifadesinin sonucunu $discount değişkenine atayabiliriz. Bu örnek, bu değerleri doğrudan her kod bloğundaki $discount değişkenine kolayca atayabilirdi. Bunu if deyimiyle çok sık kullandığımı söyleyemem ama yakın zamanda bunu kullandığım bir örnek var.
Alternatif yürütme yolu
if ifadesi, yalnızca ifadenin $true olduğu durumlar için değil, aynı zamanda $false olduğu durumlar için de bir eylem belirtmenize olanak tanır. İşte bu noktada else ifadesi devreye giriyor.
başka
else ifadesi, kullanıldığında her zaman if ifadesinin son kısmıdır.
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."
}
Bu örnekte, bunun bir dosya olduğundan emin olmak için $path yolunu kontrol ediyoruz. Dosyayı bulursak taşırız. Aksi takdirde uyarı yazarız. Bu tür dallanma mantığı çok yaygındır.
İç içe eğer
if ve else ifadeleri bir komut dosyası bloğu alır, böylece başka bir if ifadesi de dahil olmak üzere herhangi bir PowerShell komutunu bunların içine yerleştirebiliriz. Bu, çok daha karmaşık bir mantıktan yararlanmanıza olanak tanır.
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."
}
}
Bu örnekte önce mutlu yolu test ediyoruz, sonra harekete geçiyoruz. Bu başarısız olursa, başka bir kontrol daha yaparız ve kullanıcıya daha ayrıntılı bilgi sağlarız.
elseif
Sadece tek bir koşullu kontrolle sınırlı değiliz. if ve else ifadelerini elseif ifadesini kullanarak iç içe yerleştirmek yerine birbirine zincirleyebiliriz.
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."
}
Yürütme yukarıdan aşağıya doğru gerçekleşir. İlk olarak üstteki if ifadesi değerlendirilir. Eğer bu $false ise, listedeki bir sonraki elseif veya else öğesine geçer. Bu son else, diğerlerinden hiçbiri $true döndürmediğinde gerçekleştirilecek varsayılan eylemdir.
anahtar
Bu noktada switch ifadesinden bahsetmem gerekiyor. Bir değerle birden fazla karşılaştırma yapmak için alternatif bir sözdizimi sağlar. anahtar ile bir ifade belirtirsiniz ve bu sonuç birkaç farklı değerle karşılaştırılır. Bu değerlerden biri eşleşirse eşleşen kod bloğu yürütülür. Bu örneğe bir göz atın:
$itemType = 'Role'
switch ( $itemType )
{
'Component'
{
'is a component'
}
'Role'
{
'is a role'
}
'Location'
{
'is a location'
}
}
$itemType ile eşleşebilecek üç olası değer vardır. Bu durumda Rol ile eşleşir. Size switch operatörünü biraz tanıtmak için basit bir örnek kullandım. Başka bir makalede switch ifadesi hakkında bilmek istediğiniz her şey hakkında daha fazla konuşacağım.
Dizi satır içi
Çeşitli komut satırı argümanlarıyla yürütülebilir bir dosyayı başlatan Invoke-SnowSql adında bir işlevim var. İşte argüman dizisini oluşturduğum fonksiyondan bir klip.
$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
}
)
$Debug ve $Path değişkenleri, işlev üzerinde son kullanıcı tarafından sağlanan parametrelerdir. Bunları dizimin başlatılması sırasında satır içi değerlendiriyorum. $Debug doğruysa, bu değerler doğru yerde $snowSqlParam'a düşer. Aynı şey $Path değişkeni için de geçerlidir.
Karmaşık işlemleri basitleştirin
Kontrol edilecek çok fazla karşılaştırmanın olduğu ve If ifadenizin ekranın sağ tarafına doğru kaydığı bir durumla karşılaşmanız kaçınılmazdır.
$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
}
Okunması zor olabilir ve bu da sizi hata yapmaya daha yatkın hale getirir. Bu konuda yapabileceğimiz birkaç şey var.
Hat devamı
PowerShell'de komutu bir sonraki satıra kaydırmanıza izin veren bazı operatörler vardır. Mantıksal operatörler -and ve -or, ifadenizi birden çok satıra bölmek istiyorsanız kullanabileceğiniz iyi operatörlerdir.
if ($null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
)
{
# Do Something
}
Orada hâlâ çok şey oluyor ama her parçayı kendi çizgisine yerleştirmek büyük fark yaratıyor. Bunu genellikle ikiden fazla karşılaştırma aldığımda veya herhangi bir mantığı okumak için sağa kaydırmam gerektiğinde kullanırım.
Sonuçların önceden hesaplanması
Bu ifadeyi if ifadesinden çıkarıp yalnızca sonucu kontrol edebiliriz.
$needsSecureHomeDrive = $null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
if ( $needsSecureHomeDrive )
{
# Do Something
}
Bu önceki örnekten çok daha temiz hissettiriyor. Ayrıca size gerçekte neyi kontrol ettiğinizi açıklayan bir değişken adı kullanma fırsatı da verilir. Bu aynı zamanda gereksiz yorumlardan kaçınan kendi kendini belgeleyen kod örneğidir.
Çoklu if ifadeleri
Bunu birden fazla ifadeye bölebilir ve bunları birer birer kontrol edebiliriz. Bu durumda sonuçları birleştirmek için bir bayrak veya izleme değişkeni kullanırız.
$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
}
Bayrak mantığının doğru çalışması için mantığı tersine çevirmem gerekiyordu. Her değerlendirme ayrı bir if ifadesidir. Bunun avantajı, hata ayıklama yaparken mantığın tam olarak ne yaptığını söyleyebilmenizdir. Aynı zamanda çok daha iyi bir ayrıntı ekleyebildim.
Bariz dezavantajı, yazmanın çok daha fazla kod gerektirmesidir. Kodun incelenmesi daha karmaşıktır çünkü tek bir mantık satırı alır ve onu 25 veya daha fazla satıra ayırır.
İşlevleri kullanma
Tüm bu doğrulama mantığını bir fonksiyona da taşıyabiliriz. Bir bakışta bunun ne kadar temiz göründüğüne bakın.
if ( Test-SecureDriveConfiguration -ADUser $user )
{
# do something
}
Doğrulamayı yapmak için yine de işlevi oluşturmanız gerekir, ancak bu, bu kodla çalışmayı çok daha kolaylaştırır. Bu kodun test edilmesini kolaylaştırır. Testlerinizde Test-ADDriveConfiguration çağrısını taklit edebilirsiniz ve bu işlev için yalnızca iki teste ihtiyacınız vardır. Biri $true değerini döndürür, diğeri $false değerini döndürür. Diğer işlevi test etmek daha kolaydır çünkü çok küçüktür.
Bu fonksiyonun gövdesi hâlâ başladığımız tek satırlık veya son bölümde kullandığımız genişletilmiş mantık olabilir. Bu, her iki senaryo için de işe yarar ve bu uygulamayı daha sonra kolayca değiştirmenize olanak tanır.
Hata işleme
if ifadesinin önemli bir kullanımı, hatalarla karşılaşmadan önce hata koşullarını kontrol etmektir. Bunun iyi bir örneği, bir klasörü oluşturmaya çalışmadan önce mevcut olup olmadığını kontrol etmektir.
if ( -not (Test-Path -Path $folder) )
{
New-Item -Type Directory -Path $folder
}
Bir istisnanın olmasını bekliyorsanız, bunun aslında bir istisna olmadığını söylemek isterim. Bu nedenle değerlerinizi kontrol edin ve mümkün olan yerlerde koşullarınızı doğrulayın.
Gerçek istisna yönetimi konusuna biraz daha dalmak istiyorsanız, istisnalar hakkında bilmek istediğiniz her şeyi anlatan bir makalem var.
Son sözler
if ifadesi çok basit bir ifade olmasına rağmen PowerShell'in temel bir parçasıdır. Yazdığınız hemen hemen her senaryoda bunu birçok kez kullandığınızı göreceksiniz. Umarım daha önce olduğundan daha iyi anlamışsınızdır.