19.07.2024

Get-ChildItem ve -Exclude parametresi

Bazen bir dosya aramak için -Path, -Recurse, -Include parametrelerini kullanmak yetmez, bir de -Exclude kullanmak gerekir. Örneğin Windows klasörünün altında sysdm.cpl dosyasını arıyorum, ama WinSxS klasörünün altındaki kopya(lar|s)ını listelemek istemiyorum. O amaçla aşağıdaki komutlardan herhangi birini kullandığımda hiç sonuca ulaşamıyorum.

Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -Exlude "C:\Windows\WinSxS"
Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -Exlude "C:\Windows\WinSxS*"
Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -Exlude "*WinSxS*"

Çünkü, Exclude parametresi bunun için tasarlanmamış. Sadece dosya isimlerinde bir kıyaslama yapabiliyor. Aynı -Include'da olduğu gibi. Alternatif çözümler mevcut. Örneğin

Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse | where-Object {$_.FullName -notlike "*WinSxS*"}

Ama bu şekilde aslında Get-ChildItem bütün WinSxS alt klasörünü tarıyor, ama çıkan sonuçarın içinde WinSxS geçiyorsa bunlar ekrana yazılmıyor. Bu istediğim birşey değil, ama daha iyisini bulamadım.

Windows klasörünün altında bazı yüksek güvenlikli alt klasörler olduğu için ekranın kırmızı hata mesajları ile dolmasını engellemek için -ErrorAction SilentlyContinue (veya kısaca -EA silent) kullanılabilir.

Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -ErrorAction SilentlyContinue | 
	Where-Object {$_.FullName -notlike "*WinSxS*"}

Bunu uzun bulanlar için (ki ben de buluyorum) alias'lar ve kısaltmalar var

dir C:\Windows sysdm.cpl -r -ea silent | ? fullName -notlike "*WinSxS*"

Hiç yorum yok: