Aracılığıyla paylaş


if deyimi hakkında bilmek istediğiniz her şey

Diğer birçok dilde olduğu gibi PowerShell'de de betiklerinizde koşullu kod yürütmeye yönelik deyimler bulunur. Bu ifadelerden biri If deyimidir. Bugün PowerShell'deki en temel komutlardan birine ayrıntılı bir şekilde göz atacağız.

Uyarı

Bu makalenin özgün sürümü@KevinMarquettetarafından yazılan blogda yer almıştır. PowerShell ekibi, bu içeriği bizimle paylaştığı için Kevin'e teşekkür ederiz. Lütfen PowerShellExplained.comadresinde blogunu inceleyin.

Koşullu yürütme

Betiklerinizin genellikle kararlar alması ve bu kararlara göre farklı mantık yürütmesi gerekir. Koşullu yürütmeyi kastetdiğim budur. Değerlendirilecek bir deyiminiz veya değeriniz var, ardından bu değerlendirmeye göre kodun farklı bir bölümünü yürütebilirsiniz. if deyimi tam olarak bunu yapar.

if ifadesi

if deyiminin temel bir örneği aşağıda verilmiştir:

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

if deyiminin yaptığı ilk şey ifadeyi parantez içinde değerlendirmektir. $trueolarak değerlendirilirse, küme ayraçlarındaki scriptblock'i yürütür. Değer $falseise bu betik bloğunu atlayarak geçer.

Önceki örnekte if deyimi yalnızca $condition değişkenini değerlendiriyormuş. Bu, $true idi ve komut bloğunun içinde Write-Output komutunu yürütecekti.

Bazı dillerde, if deyiminden sonra tek bir kod satırı yerleştirebilirsiniz ve bu kod yürütülür. PowerShell'de böyle bir durum söz konusu değildir. Düzgün çalışması için parantez içeren tam bir scriptblock sağlamanız gerekir.

Karşılaştırma işleçleri

için if deyiminin en yaygın kullanımı, iki öğeyi birbiriyle karşılaştırmaktır. PowerShell'in farklı karşılaştırma senaryoları için özel işleçleri vardır. 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 denetimi yapar.

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

Bu örnekte, 5 bilinen bir değerini alıyorum ve eşleşip eşleşmediğini görmek için $value ile karşılaştırıyorum.

Olası kullanım örneklerinden biri, bir eylem gerçekleştirmeden önce değerin durumunu denetlemektir. Bir hizmeti başlatabilir ve Restart-Service'ı çağırmadan önce durumun çalışır durumda olup olmadığını kontrol edebilirsiniz.

C# gibi diğer dillerde eşitlik için == (örn. 5 == $value) kullanmak yaygındır, ancak bu PowerShell ile çalışmaz. İnsanların yaptığı bir diğer yaygın hata da değişkenlere değer atamak için ayrılmış eşittir işaretini (örn. 5 = $value) kullanmaktır. Bilinen değerinizi sola yerleştirerek, bu hatayı yapmanın daha tuhaf olmasına neden olur.

Bu işlecin (ve diğerlerinin) birkaç varyasyonu vardır.

  • -eq büyük/küçük harfe duyarsız eşitlik
  • -ieq büyük/küçük harfe duyarsız eşitlik
  • -ceq büyük/küçük harfe duyarlı eşitlik

-ne eşit değil

Birçok işlecin, karşıt sonucu denetleyen ilgili bir işleci vardır. -ne değerlerin birbirine eşit olmadığını doğrular.

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

Eylemin yalnızca değer 5değilken yürütülmesini sağlamak için bunu kullanın. Başlatmadan önce bir hizmetin çalışır durumda olup olmadığını kontrol etmek iyi bir kullanım örneği olabilir.

Çeşitlemeleri:

  • büyük/küçük harfe duyarlı olmayan -ne eşit değil
  • büyük/küçük harfe duyarlı olmayan -ine eşit değil
  • -cne büyük/küçük harfe duyarlı olarak eşit olmayan

Bunlar -eqters varyasyonlarıdır. Diğer işleçler için varyasyonları listelediğimde bu türleri birlikte gruplandıracağım.

-gt büyüktür veya küçüktür için -ge -lt -le

Bu işleçler, bir değerin başka bir değerden daha büyük veya daha küçük olup olmadığını denetlerken kullanılır. -gt -ge -lt -le, GreaterThan, GreaterThanOrEqual, LessThan ve LessThanOrEqual ifadeleridir.

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

Çeşitlemeleri:

  • -gt büyüktür
  • büyük/küçük harfe duyarlı olmayan -igt
  • -cgt'dan büyük, büyük/küçük harfe duyarlı
  • -ge büyüktür veya eşittir
  • -ige büyük veya eşit, büyük/küçük harfe duyarsız
  • -cge eşit veya daha büyük, büyük/küçük harfe duyarlı
  • -lt'dan küçüktür
  • küçük harfe duyarlı olmayan -ilt
  • küçük harfe duyarlı, -clt'dan küçük
  • -le küçük veya eşit
  • -ile küçük veya eşit, büyük/küçük harfe duyarsız
  • küçük veya eşit, büyük/küçük harfe duyarlı -cle

Neden bu operatörler için büyük/küçük harf duyarlı ve duyarsız seçenekleri kullandığınızı bilmiyorum.

-like genel arama karakteri eşleşmeleri

PowerShell'in kendi joker karakter tabanlı desen eşleştirme söz dizimi vardır ve bunu -like işleciyle kullanabilirsiniz. Bu joker karakter desenleri oldukça temeldir.

  • ? tek bir karakterle eşleşir
  • * herhangi bir sayıda karakterle eşleşir
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
    # do something
}

Örüntünün dizenin tamamıyla eşleştiğini belirtmek önemlidir. Dizenin ortasındaki bir şeyi eşleştirmeniz gerekiyorsa, * dizenin her iki ucuna yerleştirmeniz gerekir.

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

Çeşitlemeleri:

  • büyük/küçük harfe duyarlı olmayan joker karakter -like
  • büyük/küçük harfe duyarlı olmayan joker karakter -ilike
  • Joker karakter büyük/küçük harfe duyarlı -clike
  • -notlike büyük/küçük harfe duyarlı olmayan joker karakter eşleşmedi
  • -inotlike büyük/küçük harfe duyarlı olmayan joker karakter eşleşmedi
  • -cnotlike büyük/küçük harfe duyarlı joker karakter eşleşmedi

-match düzenli ifade

-match işleci, normal ifade tabanlı eşleşme için bir dizeyi denetlemenize 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 deseni varsayılan olarak dizenin herhangi bir yerinde eşleşir. Bu nedenle, aşağıdaki gibi eşleşmesini istediğiniz bir alt dize belirtebilirsiniz:

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

Regex kendi karmaşık bir dilidir ve araştırılmaya değer. -match hakkında daha fazla bilgi alıyorum ve başka bir makalede regex kullanmanın birçok yolunu.

Çeşitlemeleri:

  • Büyük/küçük harfe duyarlı olmayan regex -match
  • Büyük/küçük harfe duyarlı olmayan regex -imatch
  • -cmatch büyük/küçük harfe duyarlı regex
  • -notmatch büyük/küçük harfe duyarlı olmayan regex eşleşmedi
  • -inotmatch büyük/küçük harfe duyarlı olmayan regex eşleşmedi
  • -cnotmatch büyük/küçük harfe duyarlı düzenli ifade eşleşmedi

-türü

Bir değerin türünü -is işleciyle de 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ş olarak ya bir hizmet ya da bir hizmet adı olabilir. Ardından bir hizmetiniz olup olmadığını kontrol edin ve sadece isme sahipseniz hizmeti getirin.

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

Çeşitlemeleri:

  • -is tipinde
  • -isnot türünde değil

Koleksiyon işleçleri

Önceki işleçleri tek bir değerle kullandığınızda, sonuç $true veya $false. Bu, bir koleksiyonla çalışırken biraz farklı şekilde uygulanır. Koleksiyondaki her öğe değerlendirilir ve işleç $trueolarak değerlendirilen her değeri döndürür.

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

Bu, if ifadesinde doğru çalışıyor. Bu yüzden işleciniz bir değer döndürür ve ardından deyimin tamamı $trueolur.

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

Burada ayrıntıların içinde benim dikkat çekmem gereken küçük bir tuzak var. -ne işlecini bu şekilde kullanırken, mantığa yanlışlıkla tersten bakmak kolay olabilir. Koleksiyonla -ne kullanılması, koleksiyondaki herhangi bir öğenin değerinizle eşleşmemesi durumunda $true 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 ele alan -contains ve -in operatörlerimiz var. ve -notcontains beklediğiniz şeyi yapar.

-içerir

-contains işleci koleksiyonda değerinizi kontrol eder. Eşleşme bulunduğunda hemen $truedöndürür.

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

Bu, bir koleksiyonun değerinizi içerip içermediğini görmek için tercih edilen yöntemdir. Where-Object (veya -eq) kullanmak, her seferinde listenin tamamını dolaşır ve bu önemli ölçüde daha yavaştır.

Çeşitlemeleri:

  • Büyük/küçük harfe duyarlı olmayan eşleşme -contains
  • Büyük/küçük harfe duyarlı olmayan eşleşme -icontains
  • Büyük/küçük harfe duyarlı eşleşme -ccontains
  • büyük/küçük harfe duyarlı olmayan -notcontains eşleşmedi
  • büyük/küçük harfe duyarlı olmayan -inotcontains eşleşmedi
  • Büyük küçük harf duyarlı -cnotcontains eşleşmiyor

-içinde

-in işleci tıpkı -contains işleci gibidir ancak koleksiyon sağ taraftadır.

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

Çeşitlemeleri:

  • Büyük/küçük harfe duyarlı olmayan eşleşme -in
  • Büyük/küçük harfe duyarlı olmayan eşleşme -iin
  • Büyük/küçük harfe duyarlı eşleşme -cin
  • büyük/küçük harfe duyarlı olmayan -notin eşleşmedi
  • büyük/küçük harfe duyarlı olmayan -inotin eşleşmedi
  • büyük/küçük harfe duyarlı -cnotin eşleşmedi

Mantıksal işleçler

Mantıksal işleçler, diğer ifadeleri ters çevirmek veya birleştirmek için kullanılır.

-değil

-not işleci bir ifadeyi $false'den $true'ye veya $true'ten $false'e çevirir. burada, Test-Path$falseolduğunda eylem gerçekleştirmek istediğimiz bir örnek verilmiştir.

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

Bahsettiğimiz işleçlerin çoğunda, -not işlecini kullanmanız gerekmeyen bir çeşitleme vardır. Ancak hala yararlı olduğu zamanlar vardır.

! operatör

-notiçin diğer ad olarak ! kullanabilirsiniz.

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

C# gibi başka dillerden gelen kişilerin daha fazla kullandığı ! görebilirsiniz. Yazmayı tercih ediyorum çünkü senaryolarıma hızlı bir şekilde bakarken görmem zor oluyor.

-ve

İfadeleri -and işleciyle birleştirebilirsiniz. Bunu yaptığınızda, ifadenin tamamının $trueolması 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 veya daha büyük, sağ taraf için 55'ten küçük olmalıdır. Bu örnekte daha net hale getirmek için fazladan ayraç ekledim ama ifade basit olduğu sürece isteğe bağlı. Bunlar olmadan da aynı örnek aşağıda verilmiştir.

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

Değerlendirme soldan sağa gerçekleşir. İlk öğe $falseolarak değerlendirilirse, erken çıkar ve doğru karşılaştırmayı yapmaz. Bu, kullanmadan önce bir değerin var olduğundan emin olmanız gerektiğinde kullanışlıdır. Örneğin, Test-Path bir $null yolu verirseniz bir hata verir.

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

-veya

-or, iki ifade belirtmenize olanak tanır ve bunlardan biri $trueise $true döndürür.

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

-and işlecinde olduğu gibi değerlendirme de soldan sağa gerçekleşir. İlk bölüm $trueise, deyimin tamamı $true olur ve ifadenin geri kalanını işlemez.

Söz diziminin bu işleçler için nasıl çalıştığını da not edin. İki ayrı ifadeye ihtiyacınız vardır. Kullanıcıların hatalarının farkında olmadan $value -eq 5 -or 6 böyle bir şey yapmaya çalıştıklarını gördüm.

-xor özel veya

Bu biraz sıra dışı. -xor yalnızca bir ifadenin $trueolarak değerlendirilmesine izin verir. Bu nedenle, her iki öğe de $false veya her iki öğe de $trueise, ifadenin tamamı $falseolur. Buna bakmanın bir diğer yolu da ifadenin sonuçları farklı olduğunda yalnızca $true olmasıdır.

Herkesin bu mantıksal işleci kullanması çok nadirdir ve bunu neden kullanacağıma dair iyi bir örnek bulamıyorum.

Bit düzeyinde işleçler

Bit düzeyinde işleçler, değerlerin içindeki bitler üzerinde hesaplamalar yapar ve sonuç olarak yeni bir değer üretir. bit düzeyinde işleçlerin öğretilmesi bu makalenin kapsamı dışındadır, ancak bunların listesi aşağıda verilmiştir.

  • -band ikili AND
  • İkili VEYA -bor
  • -bxor ikili özel VEYA
  • -bnot ikili DEĞİl
  • -shl sola kaydır
  • -shr sağa kaydırma

PowerShell ifadeleri

Koşul deyiminin içinde normal PowerShell kullanabiliriz.

if ( Test-Path -Path $Path )

Test-Path yürütüldüğünde $true veya $false döndürür. Bu, diğer değerleri döndüren komutlar için de geçerlidir.

if ( Get-Process Notepad* )

Bir işlem döndürülmüşse $true, döndürülmemişse $false olarak değerlendirilir. İşlem hattı ifadelerini veya aşağıdaki gibi diğer PowerShell deyimlerini kullanmak son derece geçerlidir:

if ( Get-Process | where Name -EQ Notepad )

Bu ifadeler -and ve -or işleçleriyle birleştirilebilir, ancak bunları alt ifadelere ayırmak için parantez kullanmanız gerekebilir.

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

$null kontrolü

Sonucun olmaması veya $null değerine sahip olunması, if deyiminde $false olarak değerlendirilir. $null'u özellikle kontrol ederken, $null'i sol tarafa yerleştirmek en iyi uygulamadır.

if ( $null -eq $value )

PowerShell'de $null değerlerle ilgilenirken birkaç nüans vardır. Daha derine inmek istiyorsanız, hakkında bilmek istediğiniz her şeyi $nullhakkında bir makalem var.

Koşul içindeki değişken ataması

Prasoon Karunan V bana hatırlatana kadar bunu eklemeyi neredeyse unutuyordum.

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

Normalde bir değişkene değer atadığınızda, değer işlem hattına veya konsola iletilmez. Bir alt ifadede değişken ataması yaptığınızda işlem hattına geçirilir.

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

$first atamasının çıkışı olmadığını ve $second atamanın nasıl olduğunu görün. Bir atama if deyiminde yapıldığında, yukarıdaki $second atama gibi yürütülür. Bunu nasıl kullanabileceğinize ilişkin temiz bir örnek aşağıda verilmiştir:

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

Eğer $process'a bir değer atanırsa, o zaman ifade $true olur ve $process durdurulur.

Bu bir eşitlik denetimi olmadığından bunu -eq ile karıştırmadığınızdan emin olun. Bu, çoğu kişinin bu şekilde çalıştığını fark etmediğinden daha belirsiz bir özelliktir.

Betik bloğundan değişken atama

if deyimi betik bloğunu, bir değişkene değer atamak için de kullanabilirsiniz.

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

Her bir betik bloğu, komutların sonucunu veya değeri çıkış olarak yazıyor. if deyiminin sonucunu $discount değişkenine atayabiliriz. Bu örnek, bu değerleri doğrudan her betik bloğunda $discount değişkenine kolayca atamış olabilir. Bunu if deyimiyle sık kullandığımı söyleyemem, ancak bunu son zamanlarda kullandığım bir örneğim var.

Alternatif yürütme yolu

if deyimi yalnızca deyimi $trueolduğunda değil, aynı zamanda $falseolduğunda için de bir eylem belirtmenize olanak tanır. else deyimi burada devreye girer.

başka

else deyimi kullanıldığında her zaman if deyiminin son bölümü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, $path'ın bir dosya olduğundan emin olmak için kontrol ediyoruz. Dosyayı bulursak, taşıyacağız. Aksi takdirde bir uyarı yazarız. Bu tür dallanma mantığı çok yaygındır.

İç içe eğer

if ve else deyimleri bir betik bloğu alır, böylece başka bir if deyimi de dahil olmak üzere tüm PowerShell komutlarını içlerine yerleştirebiliriz. Bu, çok daha karmaşık mantık kullanmanı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 edeceğiz ve ardından üzerinde işlem yapacağız. Bu başarısız olursa, kullanıcıya daha ayrıntılı bilgi sağlamak için başka bir denetim yaparız.

elseif

Yalnızca tek bir koşullu denetimle sınırlı değildir. elseif deyimini kullanarak iç içe yerleştirme yerine if ve else deyimlerini 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 en üstteki if deyimi değerlendirilir. Eğer bu $falseise, o zaman listedeki bir sonraki elseif veya else'ye iner. Diğerlerinin hiçbiri $truedöndürmezse, varsayılan eylem olarak gerçekleştirilecek olan son else'dır.

şalter

Bu noktada switch ifadesinden bahsetmem gerekiyor. Bir değerle birden çok karşılaştırma yapmak için alternatif bir söz dizimi sağlar. switchile 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. Şu örneğe göz atın:

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

$itemTypeeşleşebilecek üç olası değer vardır. Bu durumda, Roleile eşleşir. switch operatörüne biraz maruz kalmanı sağlamak için basit bir örnek kullandım. Başka bir makalede switch ifadesi hakkında bilmek istediğiniz her şey hakkında daha fazla bilgi veriyorum.

Satır içi dizi

Invoke-SnowSql adında, birkaç komut satırı bağımsız değişkeni ile çalışan bir yürütülebilir dosya başlatan bir işlevim var. O işlevden, bağımsız değişken dizisini oluşturduğum bir parça aşağıdadır.

$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şlevde son kullanıcı tarafından sağlanan parametrelerdir. Bunları dizimi başlatırken doğrudan değerlendiriyorum. $Debug doğruysa, bu değerler doğru yerde $snowSqlParam olur. Aynı durum $Path değişkeni için de geçerlidir.

Karmaşık işlemleri basitleştirme

Kontrol edilmesi gereken aşırı fazla karşılaştırma içeren bir durumla karşılaşmanız kaçınılmazdır ve böylece if ifadeniz ekranın sağ tarafından dışarı kayabilir.

$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
}

Okuması zor olabilir ve bu da sizi hata yapmaya daha meyilli hale getirir. Bu konuda yapabileceğimiz birkaç şey var.

Satır devamlılığı

PowerShell'de komutu bir sonraki satıra sarmalamanıza olanak sağlayan bazı işleçler vardır. -and ve -or mantıksal işleçler, ifadenizi birden çok satıra bölmek istiyorsanız kullanabileceğiniz iyi işleçlerdir.

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

Orada hala çok şey oluyor, ama her parçayı kendi hattına yerleştirmek büyük bir fark yaratır. Genellikle ikiden fazla karşılaştırma yaptığımda veya mantığın herhangi birini okumak için sağa kaydırmam gerektiğinde bunu kullanırım.

Sonuçları önceden hesaplama

Bu ifadeyi if ifadesinden çıkarabilir ve yalnızca sonucu denetleyebiliriz.

$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 bir histir. Ayrıca, gerçekten neleri denetlediğini açıklayan bir değişken adı kullanma fırsatı da verilir. Bu aynı zamanda gereksiz açıklamaları önleyen kendi kendini belgeleyen bir kod örneğidir.

Birden çok if deyimi

Bunu birden çok deyime ayırabilir ve tek tek 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 düzgün çalışması için mantığı ters çevirmem gerekirdi. Her değerlendirme tek bir if ifadesidir. Bunun avantajı, hata ayıklarken mantığın tam olarak ne yaptığını anlayabilebilmenizdir. Aynı anda çok daha iyi ayrıntı ekleyebildim.

Bunun en belirgin dezavantajı, yazacak çok daha fazla kod olmasıdır. Tek bir mantıksal ifadeyi alıp 25 veya daha fazla satıra genişlettiğinde kodun görünümü daha karmaşık hale gelir.

İşlevleri kullanma

Ayrıca tüm bu doğrulama mantığını bir işleve taşıyabiliriz. Bunun bir bakışta ne kadar temiz göründüğüne bakın.

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

Doğrulamayı yapmak için işlevi yine de oluşturmanız gerekir, ancak bu kodla çalışmayı çok daha kolay hale getirir. Bu kodu test etmek daha kolay hale getirir. Testlerinizde, Test-ADDriveConfiguration çağrısını simüle edebilirsiniz ve de bu işlev için yalnızca iki teste ihtiyacınız vardır. Biri $true, diğeri de $falsedöndürür. Diğer işlevin test edilmesi çok küçük olduğundan daha basittir.

Bu işlevin gövdesi, başladığımız tek satırlı veya son bölümde kullandığımız detaylı mantık olabilir yine de. Bu, her iki senaryo için de iyi çalışır ve bu uygulamayı daha sonra kolayca değiştirmenize olanak tanır.

Hata işleme

if deyiminin önemli bir kullanımı, hatalarla karşılaşmadan önce hata koşullarını kontrol etmektir. Bir klasörü oluşturmaya çalışmadan önce zaten var olup olmadığını denetlemek iyi bir örnektir.

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

Eğer bir istisna olmasını bekliyorsanız, bunun bir istisna olmadığını söylemek isterim. Bu nedenle, değerlerinizi denetleyin ve koşullarınızı mümkün olan yerlerde doğrulayın.

Gerçek özel durum işlemesini biraz daha derinlemesine incelemek istiyorsanız, özel durumlar hakkında bilmek istediğiniz her şeyihakkında bir makalem var.

Son sözcükler

if deyimi çok basit bir deyimdir ancak PowerShell'in temel bir parçasıdır. Yazdığınız hemen her betikte bunu birden çok kez kullanırken bulacaksınız. Umarım öncekinden daha iyi bir anlayışa sahipsindir.