Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
$true
olarak değerlendirilirse, küme ayraçlarındaki scriptblock
'i yürütür. Değer $false
ise 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 5
değ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 -eq
ters 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ç $true
olarak 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ı $true
olur.
$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 $true
dö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
$false
olduğ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
-not
iç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 $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 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 $false
olarak 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 $true
ise $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 $true
ise, 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 $true
olarak değerlendirilmesine izin verir. Bu nedenle, her iki öğe de $false
veya her iki öğe de $true
ise, ifadenin tamamı $false
olur. 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 $true
olduğunda değil, aynı zamanda $false
olduğ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 $false
ise, o zaman listedeki bir sonraki elseif
veya else
'ye iner. Diğerlerinin hiçbiri $true
dö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.
switch
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. Şu örneğe göz atın:
$itemType = 'Role'
switch ( $itemType )
{
'Component'
{
'is a component'
}
'Role'
{
'is a role'
}
'Location'
{
'is a location'
}
}
$itemType
eşleşebilecek üç olası değer vardır. Bu durumda, Role
ile 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 $false
dö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.
PowerShell