PowerShell Test Yolu Cmdlet'i Nasıl Kullanılır?


Bir dosyaya, kayıt defteri anahtarına, sertifikaya veya başka bir PowerShell sürücüsü yoluna giden yolu doğrulamanız gerekiyorsa Test Yolu cmdlet'ine ihtiyacınız vardır.

Test-Path cmdlet'i, bir dosyanın ve diğer öğelerin birçok özelliğini hızlı bir şekilde kontrol etmenin basit ama kullanışlı bir yoludur. Bir dosyanın (veya diğer öğe türlerinin) var olup olmadığını, bir dizenin uygun yol biçiminde olup olmadığını, hatta bir öğenin belirli bir zamandan daha yeni veya daha eski olup olmadığını kontrol edebilir.

Bu öğreticide PowerShell Test-Path cmdlet'i hakkında her şeyi ve bunu PowerShell komut dosyalarınızı geliştirmek için nasıl kullanabileceğinizi öğreneceksiniz.

Önkoşullar

Bu eğitimdeki örnekleri takip etmek istiyorsanız bir şeye ihtiyacınız olacak; Güç kalkanı. Daha spesifik olarak, eğitimde Windows 10'da PowerShell v7.03 kullanılacaktır, ancak öğreneceğiniz tekniklerin çoğu eski sürümler için de geçerli olacaktır.

Test Yolu Cmdlet'i Ne Yapar?

PowerShell Test-Path cmdlet'i mevcut en basit komutlardan biridir. Bu, başından beri PowerShell'de bulunan ve yalnızca iki değer döndüren bir komuttur; Doğru ya da yanlış.

Ancak sadeliğin sizi kandırmasına izin vermeyin; PowerShell komut dosyalarınızdaki bilgileri doğrulamada size çok zaman kazandıracaktır.

PowerShell sağlayıcıları ve sürücüleriyle çalışırken PowerShell Test-Path cmdlet'ini kalite kontrolü olarak düşünün. Betik yazarken genellikle PowerShell sürücülerinde bulunan çeşitli öğelerle çalışacaksınız. C:\, HKLM, Cert vb. gibi PowerShell sürücüleri.

Test Yolu tüm PS sürücüleriyle çalışmaz. Örneğin, bir kayıt defteri anahtarına karşı Test-Path'i kullanmaya çalışırsanız işe yarayacaktır. Bir kayıt defteri değerine karşı Test-Path kullanmaya çalışırsanız, her seferinde False değerini döndürür.

Merak ediyorsanız hemen PowerShel'de Get-PSDrive cmdlet'ini çalıştırın ve karşınıza çıkan tüm PS sürücülerini görün.

Bu sürücülerin hepsinin içinde C:\Windows, HKLM:\Software vb. gibi yollar bulunur. PowerShell betiklerinde, yolun geçerli olup olmadığını veya mevcut olup olmadığını ilk test etmek her zaman iyi bir uygulamadır. PowerShell'in Test-Path'inin yaptığı da budur.

Test Yolu, belirli bir koşulun karşılanıp karşılanmadığına (genellikle bir dosya/klasör, kayıt defteri anahtarı) bağlı olarak Doğru veya Yanlış değerini döndüren bir koşulu tanımlar. , sertifika, hatta bir değişkenin var olup olmadığı).

Test Yolu Parametreleri ve Kullanımı

Diğer birçok PowerShell cmdlet'i gibi Test-Path cmdlet'i de davranışını değiştiren çeşitli parametrelere sahiptir. Şimdi her bir parametreyi ele alalım ve nasıl çalıştığını ve ne tür sonuçlar görmeyi bekleyebileceğinizi gösterelim.

Yol

Path parametresi, her Test-Path yürütmesinde kullanacağınız zorunlu bir parametredir. Path parametresi, varlığını test etmek istediğiniz PSDrive yolunu tanımlar.

Örneğin, C:\Foo klasörünün mevcut olup olmadığını test etmek istiyorsanız Path parametresine uygun yolu sağlarsınız. Daha sonra, C:\Foo'nin gerçekten var olup olmadığına bağlı olarak, Test-Path ya True ya da False değerini döndürür >.

PS> Test-Path -Path 'C:\Foo'
True

Aynı teknik herhangi bir öğe yolu için de kullanılabilir. Belki HKLM:\Software\Foo kayıt defteri anahtarının var olup olmadığını test etmek isteyebilirsiniz. Kayıt defteri anahtarı yolunu Yol parametresiyle kullanmanız yeterlidir.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

Bu eğitim boyunca tanıtılan tüm tekniklerin herhangi bir PowerShell sürücü yolu ile çalışacağını bilin.

Joker Karakterleri Kullanma

Bir yolun gerçek bir değere sahip olup olmadığını umursamazsanız ne olur? Bunun yerine, bir yolun belirli bir kalıpla eşleşip eşleşmediğini kontrol etmek istersiniz. Bu durumda Yol değerinde joker karakterler kullanabilirsiniz.

Belki de C:\Foo klasörünüzün Bar ile başlayan bir alt klasör içerip içermediğini kontrol etmek isteyebilirsiniz. Bu durumda joker karakter kullanabilirsiniz.

PS> Test-Path -Path 'C:\Foo\Bar*'

Yukarıdaki komutu çalıştırdığınızda, Test-Path Bar ile başlayan herhangi bir klasörün varlığını kontrol edecek ve True değerini döndürecektir. veya False, bu ölçütlerle eşleşen herhangi bir klasörün mevcut olup olmamasına bağlı olarak.

Yıldız işaretleri (*) bir veya daha fazla karakterle eşleşir ancak daha ayrıntılı bilgi edinmek ve tek bir karakteri test etmek için soru işaretlerini (?) de kullanabilirsiniz. karakter.

Yukarıdaki senaryoyu örnek olarak kullanırsak, C:\Foo\Bar1 klasörü mevcutsa, Foo'nin Bar ile başlayan herhangi bir alt klasörünü test edebilirsiniz. ve aşağıdaki komutu kullanan tam olarak dört karakterdir.

PS> Test-Path -Path 'C:\Foo\Bar?'

Herhangi bir nedenle Path parametresini joker karakterler kullanarak kullanmak ancak * gibi bir joker karakterle tam anlamıyla eşleşmek istiyorsanız, her zaman bu karakterden kaçabilirsiniz. geri tıklama (`) içeren joker karakterler.

Değişmez Yol

LiteralPath parametresi bir istisna dışında Path parametresiyle hemen hemen aynıdır; joker karakterlere izin vermez. LiteralPath'in kullanılması, yolun değerini tam anlamıyla yorumlayacaktır.

Örneğin, LIteralPath kullanarak yol değerinin içinde bir yıldız işareti veya soru işareti kullanmaya çalışırsanız, Test-Path joker karakterleri tamamen yok sayar ve C:\Foo\Bar? aşağıdaki örnekteki gibi.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

Test-Path'in beklediğiniz yolu test etmesini sağlamak için herhangi bir joker karakter kullanmanız gerekmiyorsa, varsayılan yol parametresi olarak LiteralPath'i kullanmalısınız.

Yol Türü

Varsayılan olarak, Test-Path'i çalıştırıp ona bir yol sağladığınızda, o yolda herhangi bir şey bulursa True değerini döndürür. Yolu olan öğe, dosya klasörü, kayıt defteri anahtarı, sertifika deposu vb. gibi bir kapsayıcı veya dosya, kayıt defteri değeri gibi bir yaprak olabilir veya Sertifika.

Test-Path'i daha ayrıntılı olmaya zorlayabilir ve PathType parametresini kullanarak özellikle bir kapsayıcı veya yaprak öğesi için test yapabilirsiniz.

Test-Path, varsayılan olarak PathType değerini Herhangi biri kullanır.

Örneğin, C:\Foo\Bar konumunda bir klasör varsa ve bu yolda bir dosya arıyorsanız, aşağıda gösterildiği gibi PathType parametresini kullanabilirsiniz. . Yalnızca C:\Foo\Bar adlı bir dosyanın var olup olmadığını kontrol etmek istiyorsunuz.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

Belki bunun yerine C:\Foo\Bar dosyasının gerçekten bir dosya olup olmadığını doğrulamanız gerekir. Bu durumda bir konteyner olup olmadığını kontrol edersiniz.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

Katmak

Path parametresini ve joker karakterleri kullanıyorsanız bazen daha spesifik olmanız gerekir. Bu durumda Include ve Exclude parametrelerine bakmanız gerekir.

Diyelim ki aşağıdaki klasörlere sahipsiniz:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

Bar ile başlayan ve Bar1, Bar2 vb. gibi tam olarak dört karakterden oluşan bir klasörün olup olmadığını kontrol etmek istiyorsunuz.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

Yukarıdaki komut düzgün çalışıyor ancak artık yalnızca C:\Foo içindeki Bar2 adlı klasörleri bulmak istiyorsunuz. Bu durumda Include parametresini kullanabilirsiniz.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

Yukarıdaki komut artık yalnızca esasen tek bir C:\Foo\Bar2 klasörünü test ediyor. Muhtemelen bunun yerine Test-Path -Path 'C:\Foo\Bar2' -PathType Container'ı kullanmanız daha iyi olacaktır.

Hariç tutmak

Exclude parametresi Include parametresine benzer şekilde çalışır ancak bu sefer bir dizeyle eşleşen yolları hariç tutar.

Belki C:\Foo klasöründe en az bir dosya olduğundan emin olmak istersiniz ve aşağıdaki komutu kullanırsınız:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

Yukarıdaki komut, herhangi bir dosya C:\Foo konumundaysa True veya False değerini döndürür. Ancak belki de txt dosya uzantısına sahip başka dosyaların da mevcut olduğundan emin olmak isteyebilirsiniz. Bu durumda, txt uzantısına sahip tüm dosyaları testin dışında bırakmak için joker karakter kullanarak Exclude parametresini kullanabilirsiniz.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

Filtre

Microsoft'un belgelerine göre Filter parametresi "sağlayıcının biçiminde veya dilinde bir filtre belirtir. Bu parametrenin değeri Path parametresi olarak nitelendirilir. Joker karakterlerin kullanımı da dahil olmak üzere filtrenin sözdizimi sağlayıcıya bağlıdır”.

Filter parametresinin Get-Childitem gibi diğer cmdlet'lerle kullanılması gerekse de, Test-Path ile nadiren kullanılır. Filtre parametresinin iyi bir kullanımını bulduysanız lütfen Twitter'da @adbertram adresinden bize ulaşın.

İlgili: Get-ChildItem: Dosyaları, Kayıt Defterini, Sertifikayı ve Daha Fazlasını Tek Bir Şekilde Listeleme

Daha yeni

Hiç bir dosyadaki zaman damgasını kontrol edip buna göre bir karar vermeniz gerekti mi? Eğer öyleyse, NewerThan ve OlderThan parametreleri büyük miktarda kod tasarrufu sağlar. NewerThan parametresi, bir öğenin zaman damgasının belirli bir tarihten daha yeni olup olmadığını kontrol eder.

NewerThan parametresi, kontrol edilecek zaman damgasını temsil edecek bir dizeyi veya DateTime nesnesini kabul eder. Örneğin, C:\Foo\bar.txt dosyasının 20 Ocak 2021'den sonra oluşturulup oluşturulmadığını kontrol etmek için aşağıdaki gibi Test-Path komutunu çalıştırırsınız.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## or
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

Daha yaşlı

OlderThan parametresi, NewerThan parametresiyle tamamen aynıdır ancak tam tersidir. Bu parametre, bir öğenin belirli bir tarihten eski olup olmadığını kontrol eder.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## or
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

Geçerli

Bir senaryoda dinamik olarak bir yol oluşturduysanız, mücadeleyi bilirsiniz. Bazen bir tuşa kalın parmakla basabilirsiniz veya bir şekilde bir yolda özel bir karakter elde edebilirsiniz; öyleyse IsValid parametresi tam size göre.

IsValid parametresi, Test-Path'i bir öğenin varlığını kontrol eden bir cmdlet'e değil, yol sözdizimini kontrol eden bir cmdlet'e dönüştüren benzersiz bir parametredir. Bu parametre bir yolun yalnızca geçerli olup olmadığını doğrular.

Örneğin, belki bir yolun sözdizimsel olarak geçerli olup olmadığını doğrulamanız gerekebilir. Birkaç değişkenle çalışıyorsunuz ve bunları bir yol oluşturmak için birleştiriyorsunuz.

Yolları birleştirirken her zaman Join-Path cmdlet'ini kullanın. Bu sadece örnek amaçlıdır!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

Şimdi dinamik olarak oluşturduğunuz yolun geçerli olduğundan emin olmak için aşağıdaki gibi IsValid parametresini kullanın. Test-Path'in False değerini döndürdüğünü göreceksiniz.

PS> Test-Path -LiteralPath $path -IsValid
False

abc:dffC:\ yolu artık geçerli bir yol değil ve bu durumdan yola çıkarak bir doğrulama yordamı oluşturmanıza olanak tanıyor.

PowerShell v6.1.2 veya önceki bir sürümünü kullanıyorsanız ve IsValid ile PathType parametrelerini birlikte kullanıyorsanız, Test-Path yoksayacaktır PathType parametresi.

Kimlik

Test-Path'te Credential parametresini bulsanız da, bunu başka bir kullanıcı olarak PS sürücülerinde kimlik doğrulaması yapmak için kullanabileceğinizi düşünebilirsiniz. Bu geçerli bir varsayım ama yanlış.

Maalesef Credential parametresi Test-Path cmdlet'iyle pek bir şey yapmaz. Microsoft, alternatif kimlik bilgileriyle Test-Path'i çağırmak istiyorsanız Invoke-Command cmdlet'ini kullanmanızı ve burada Credential parametresini kullanmanızı önerir.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

İlgili: Invoke-Command: Uzaktan Kod Çalıştırmanın En İyi Yolu

İlgili makaleler