Bir Dosyanın Var Olup Olmadığını Kontrol Etmek için PowerShell'i Doğrulayın (Örnekler)


Dosyaları oluşturmak, okumak, güncellemek ve silmek için PowerShell kullanıyor musunuz? Öyleyse, muhtemelen hedef dosyalar mevcut olmadığında veya zaten mevcut olduğunda hatalarla karşılaşmışsınızdır. Şanslısınız ki, PowerShell'de bir dosyaya herhangi bir şey yapmadan önce dosyanın var olup olmadığını kontrol etmenin yolları var.

Örneğin, kodunuzun dosyayı hemen oluşturmasına izin vermek yerine dosyanın zaten var olduğunu test etmek daha iyidir. Aşağıdaki ekran görüntüsünde de görüldüğü gibi daha iyi kod yazabilir ve net çıktılar elde edebilirsiniz.

Bu makalede, bir dosyanın mevcut olup olmadığını kontrol etmek için PowerShell'i kullanmanın farklı yollarını öğreneceksiniz. Ayrıca, hata işleme mantığıyla daha iyi kod ve sonuçlar üretmek için bu yolların her birini nasıl kullanacağınızı da öğreneceksiniz.

Önkoşullar

Self servis şifre sıfırlama çözümüyle hizmet masası çağrılarını azaltın ve VPN kapalıyken bile uzak kullanıcılar için önbellek kimlik bilgilerini güncelleyin. Specops uReset Demosunu Alın!

Bu makale, farklı örneklerden öğreneceğiniz bir nasıl yapılır kılavuzudur. Örnekleri takip etmek için aşağıdakilere ihtiyacınız olacak:

  • Kod editörü. Önerilenler, platformlarda çalışan Visual Studio Code ve Atom'dur. Windows bilgisayarda çalışıyorsanız Windows PowerShell ISE'yi de kullanabilirsiniz.
  • Windows PowerShell 5.1 (Masaüstü) veya PowerShell 7.1 (Çekirdek). Bu makaledeki komutlar ve betikler her iki PowerShell sürümü için de geçerlidir. İster Windows, Linux veya macOS kullanıyor olun, PowerShell yüklü olduğu sürece sorun yaşamazsınız.

İlgili: Windows, Linux ve macOS'ta PowerShell 7 Nasıl İndirilir ve Kurulur

Dosyanın Var Olup Olmadığını Kontrol Etmek İçin PowerShell Kullanma

Bu makalede, bir dosyanın var olup olmadığını kontrol etmek için PowerShell'in kullanılacağı üç yöntem ele alınmaktadır. Bu üç yöntemin kullanımı kullanım açısından farklılık gösterir ancak konsept ve nihai amaç aynıdır. Bu üç yol şunlardır:

  • Test Yolu Cmdlet'i.
  • Get-Item ve Get-ChildItem Cmdlet'i.
  • System.IO.File Sınıfı.

Hata işlemede bunların nasıl kullanılacağı da dahil olmak üzere, bu üç yöntemin her birinin örnekleri ve demoları olacaktır.

Test Yolunu Kullanma

İlk yol, bir yolun veya dosyanın var olup olmadığını belirlemek için özel olarak tasarlanmış Test-Path cmdlet'idir. Bir dosyanın var olup olmadığını test etmek için bu cmdlet'i kullanırken sonuç true veya false olur. Sonuç, dosyanın var olup olmadığını gösterir.

Aşağıda Test-Path cmdlet'inin bir dosyayı kontrol ederken çalışmasını sağlayacak temel sözdizimi verilmiştir.

Test-Path -Path <PATH to FILE> -PathType Leaf

Örneğin, C:\temp\important_file.txt adında böyle bir dosyanın var olup olmadığını kontrol etmeniz gerekiyorsa aşağıdaki kodu kullanın. -PathType Leaf bölümünün cmdlet'e açıkça bir dizini değil, bir dosyayı kontrol etmesini söylediğini unutmayın.

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

Yukarıdaki komutu PowerShell'de çalıştırdığınızda, dosya mevcutsa sonuç True değerini döndürür. Aksi takdirde, aşağıdaki ekran görüntüsünden de görebileceğiniz gibi sonuç Yanlış olacaktır.

İlgili: PowerShell Test Yolu Cmdlet'i Nasıl Kullanılır

Örnek: Dosya Mevcut Değilse Dosya Oluşturma

Bu örnek, belirli bir konumda dosya oluşturmaya yönelik tipik bir kullanım durumudur. “Dosya zaten mevcut” hatasını önlemek için komut dosyası, dosyayı oluşturmadan önce dosyanın zaten mevcut olup olmadığını kontrol eder. Dosya mevcutsa, komut dosyası bir mesaj gösterir ve artık dosyayı oluşturma girişiminde bulunmaz.

Aşağıdaki kodu kopyalayın ve Create-NewFile.ps1 adlı bir dosyaya kaydedin. Dosyanın çıktı konumunu değiştirmek istiyorsanız $path değişkeninin değerini değiştirdiğinizden emin olun. Betiği kaydettikten sonra test etmek için PowerShell'de çalıştırın.

# Create-NewFile.ps1

# Full path of the file
$file = 'c:\temp\important_file.txt'

#If the file does not exist, create it.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# If the file already exists, show the message and do nothing.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

Aşağıdaki ekran görüntüsü iki farklı çıkışı göstermektedir. Birincisi, dosya mevcut değilken betiği çalıştırmaktır. İkincisi, dosyayı oluşturduktan sonradır ve dosya zaten mevcuttur.

İlgili: Temel Konulara Dönüş: PowerShell Betiği Nasıl Çalıştırılır

Get-Item ve Get-ChildItem'i kullanma

Get-Item cmdlet'inin amacı öğeyi belirtilen konuma getirmektir. Karşılaştırıldığında, Get-ChildItem cmdlet'i belirtilen bir veya daha fazla konumdaki öğeleri ve alt öğeleri almak içindir. Bu iki cmdlet'in işlevi açıkça dosyaların var olup olmadığını kontrol etmek değildir.

Var olmayan bir öğeyi almak için Get-Item veya Get-ChildItem kullandığınızda ne olur? Eksik her dosya için bir hata alırsınız. Aşağıdaki komutları örnek olarak alın.

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

c:\temp\important_file.txt dosyasının mevcut olmadığını varsayalım. Yukarıdaki komutların her biri bir hata döndürür. Aşağıdaki örnekte görebileceğiniz gibi her iki komut için de hata mesajı aynıdır.

Örnek: Mevcut Dosyanın Arşivlenmesi ve Yeni Dosya Oluşturulması

Bu örnekte, komut dosyası Get-Item ve Test-Path cmdlet'lerini kullanır. Bu betiğin mantığı aşağıdakileri yapmaktır:

  • Test-Path'i kullanarak arşiv klasörünün mevcut olup olmadığını test edin.

    • Arşiv klasörü mevcut değilse, komut dosyası bu biçimde yeni bir arşiv klasörü oluşturur - yyyy-MMM-dd_hh-mm-ss-tt.
    • Daha sonra komut dosyası eski dosyayı arşiv klasörüne taşır.
  • Get-Item'i kullanarak dosyanın zaten mevcut olup olmadığını test edin.

    • Dosya mevcutsa, komut dosyası onu önce arşiv klasörüne taşır. Daha sonra komut dosyası yeni dosyayı orijinal konumda oluşturur.
    • Dosya mevcut değilse, komut dosyası yeni dosyayı oluşturur.

Aşağıdaki kodu kopyalayın ve Create-NewFileAfterArchive.ps1 olarak kaydedin. Betiği kaydettikten sonra PowerShell'de çalıştırın ve sonuçları doğrulayın.

# Create-NewFileAfterArchive.ps1

# Full path of the file
$file = 'c:\temp\important_file.txt'

#Full path to the archiving folder
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# If the file exists, move it to the archive folder, then create a new file.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## If the Archive folder does not exist, create it now.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## Move the existing file to the archive.
        Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
        Write-Host "The old file [$file] has been archived to [$archiveFolder]"
     } catch {
        throw $_.Exception.Message
     }
 }
 Create the new file
 try {
     $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
     Write-Host "The new file [$file] has been created."
 } catch {
    Write-Host $_.Exception.Message
 }

İpucu: -ErrorAction Ignore parametresi hatayı bastırır (konsolda gösterilmez) ve ayrıca hatayı $error otomatik değişkenine kaydetmez.

Aşağıdaki ekran görüntüsünde, ilk komut dosyası çalıştırması c:\temp\important_file.txt dosyasını oluşturdu. Sonraki komut dosyası çalıştırmaları her seferinde yeni bir arşiv klasörü oluşturdu, mevcut dosyayı arşiv klasörüne taşıdı ve daha sonra c:\temp\important_file.txt dosyasında yeni bir dosya oluşturur.

[System.IO.File]::Exists() .NET Yöntemini Kullanma

Bu makalede öğrenilecek son yöntem System.IO.File .NET sınıfı, özellikle de Exists() yöntemidir. PowerShell'in güçlü yönlerinden biri, .NET sınıflarını ve yöntemlerini içe aktarma ve kullanma becerisidir.

Örneğin, bir dosyanın var olup olmadığını kontrol etmek amacıyla PowerShell'de Exists() yöntemini kullanmak için aşağıdaki kodu kullanın.

[System.IO.File]::Exists("PATH")

Yukarıdaki yöntem bir boole sonucu üretir - true veya false. Sonuç true değerini döndürürse bu, hedef dosyanın var olduğu anlamına gelir. Aksi takdirde, hedef dosya mevcut olmadığında döndürülen sonuç yanlış olur.

Aşağıdaki örnek kodda komut, c:\temp\important_file.txt dosyasının varlığını kontrol eder.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file)

Aşağıdaki sonuçtan görebileceğiniz gibi sonuç true değerini döndürerek dosyanın var olduğunu doğrular.

Bu .NET metodu ile aşağıdaki örnekteki gibi üçlü işlemleri de kullanabilirsiniz. Varsayılan doğru veya yanlış sonuçları göstermek yerine, sonuç mesajını daha kısa bir uygulamayla özelleştirebilirsiniz. Ancak bu örnekteki üçlü operatör yalnızca PowerShell 7+ için geçerlidir.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

Örnek: Dosya Varsa Dosya İçeriğini Güncelleme

Bu örnek komut dosyası, yeni bir GUID değeri ekleyerek metin dosyasını günceller. Ancak içerik güncellemesi yalnızca dosya mevcutsa gerçekleşir. Aksi takdirde komut dosyası bir mesaj gösterir ve başka hiçbir şey yapmaz.

Aşağıdaki komut dosyasını kopyalayın ve Update-FileContents.ps1 olarak kaydedin. Gerekirse $file değişkeninin dosya yolu değerini değiştirin. Ardından test etmek için betiği PowerShell'de çalıştırın.

# Update-FileContents.ps1

#Full path of the file
$file = 'c:\temp\important_file.txt'

# If the file exists, append a new GUID value in the file.
if ([System.IO.File]::Exists($file)) {
    try {
        $newValue = ((New-Guid).Guid)
        Add-Content -Path $file -Value $newValue -ErrorAction STOP
        Write-Host "The file [$file] has been updated with [$newValue]"
     } catch {
        throw $_.Exception.Message
     }    
 }

# If the file does not exist, show a message and do nothing.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

Aşağıdaki ekran görüntüsünde betiğin her çalıştırma sırasında dosyayı güncellediğini görebilirsiniz. Güncelleme, [System.IO.File]::Exists() yönteminin c:\temp\important_file.txt dosyasının var olduğunu onaylaması nedeniyle gerçekleşti.

Sonunda, dosyanın içeriğini okumak için gc c:\temp\important_file.txt komutunu kullanmak, betiğin dosyayı GUID değerleriyle güncellediğini doğruladı.

İlgili: Kodlamayı Hızlandırmak için PowerShell Veri Türleri Hızlandırıcılarını Kullanma

Çözüm

Self servis parola sıfırlama çözümüyle hizmet masası çağrılarını azaltın ve VPN kapalıyken bile uzak kullanıcılar için önbellek kimlik bilgilerini güncelleyin. Specops uReset Demosunu Alın!

Bu makalede, bir dosyanın var olup olmadığını kontrol etmek için PowerShell'i kullanmanın birden fazla yolu olduğunu öğrendiniz. Dosyayla ilgili herhangi bir değişiklik yapmadan önce dosyanın varlığını kontrol etmek iyi bir uygulamadır.

Get-Item, Get-ChildItem ve Test-Path cmdlet'lerini kullanmayı öğrendiniz. [System.IO.File]::Exists() .NET yönteminin yanı sıra. Örnekler size tekniklerin nasıl kullanılacağını ve bunları hata işleme mantığıyla nasıl birleştireceğinizi gösterdi.

Bu hata mesajlarına katlanmayı bırakın. Dosyayla ilgili herhangi bir işlemden önce bir dosyanın var olup olmadığını kontrol etmek için kod ekleyerek bunların üstesinden gelin. Burada öğrendiğiniz teknikler yalnızca temel bilgileri kapsar ve bunları geliştirmek artık size kalmıştır.

İlgili makaleler