Jak wykluczyć katalog systemowy za pomocą Powershell

1

Chcę w prosty sposób wykluczyć folder systemowy z wyszukiwania w PowerShell.

Używam następującego skryptu:

$mysys = 'c:\windows'    
PS C:\> Get-ChildItem -path . -Include *.txt -Exclude '$mysys' -Recurse

Zasadniczo chcę, aby cokolwiek pod c: \ windows było całkowicie ignorowane, jednak po uruchomieniu wyszukiwania ciągle pojawiają się błędy podczas wyszukiwania pod c: \ windows; aw niektórych przypadkach podaje również znalezione wyniki.

Błąd: (dlaczego nawet przechodzi pod c: \ windows, gdy go wykluczyłem)

Get-ChildItem : Access to the path 'C:\Windows\System32\LogFiles\WMI\RtBackup' is denied. At line:1

char: 1 + Get-ChildItem -path. -Inc * * .txt -Exclude '$ mysys' -Recurse -Dept ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: PermissionDenied: (C: \ Windows \ Syst ... es \ WMI \ RtBackup: String) [Get-ChildItem], UnauthorizedAccessExcept ion + FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Commands.GetChildItemCommand

Na przykład obejmuje: (należy to wszystko wykluczyć) (w zasadzie wszystko pod c: \ windows)

> >     Directory: C:\Windows\WinSxS\amd64_microsoft-windows-c..iser-inboxdatafiles_31bf3856ad364e35_10.0.14393.0_none_9eeac2cef7a25999
> 
> 
> Mode                LastWriteTime         Length Name                 
> 
> ----                -------------         ------ ----                                                                                
> -a----        7/16/2016   6:42 AM         855814 hwcompat_RS1.txt                                                                    
> ------        7/16/2016   6:42 AM           1764 hwexclude_RS1.txt                                                                   
> ------        7/16/2016   6:42 AM           1327 wucompat.txt

Zasadniczo chcę przeprowadzić wyszukiwanie rekurencyjne pod c: \, a następnie wykluczyć wszystko, czego nie chcę. Począwszy od c: \ windows i wszystkiego pod nim.

gsb005
źródło
Opcja -exclude Get-ChildItem działa tylko na liściach, a nie na elementach ścieżki. Musisz przejść do miejsca, w którym chcesz wykluczyć.
LotPings,
Czy możesz podać mi przykład?
gsb005
1
Zobacz odpowiedź na to pytanie
LotPings,
Właśnie tego szukałem @Lotpings !! dzięki!!
gsb005
Zapraszam do głosowania na tę odpowiedź ;-)
LotPings,

Odpowiedzi:

0

Zaproponuj kilka drobnych poprawek składniowych (te zmiany nie rozwiążą twojego problemu, to po prostu lepsza składnia):

$mysys = 'c:\windows\*'    
Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse

W każdym razie...

dlaczego nawet przechodzi pod c: \ windows, kiedy go wykluczyłem

Wykluczasz tylko elementy z „C: \ windows” z wyników Get-ChildItem. GCI nadal musi sprawdzać foldery, które mu zleciłeś, aby sprawdzić, czy coś pasuje, co powoduje błąd odmowy dostępu.

Jeśli chcesz całkowicie uniknąć folderów, do których nie masz dostępu, musisz zbudować listę folderów, które chcesz sprawdzić za pomocą GCI, zamiast po prostu powiedzieć GCI, aby sprawdzało wszystko na bieżącej ścieżce.

Jedynym sposobem na zrobienie tego jest w zasadzie ta sama procedura: sprawdź każdy folder i zachowaj listę tych, na których nie masz dostępu, a następnie użyj tej listy w GCI. W końcu nadal próbujesz uzyskać dostęp do folderów (i zgłaszasz błąd), więc w zasadzie nie ma z tego powodu korzyści (oczekuj dodatkowej złożoności).

Jeśli po prostu nie lubisz widzieć czerwonych błędów podczas uruchamiania polecenia , możesz użyć -ErrorActionparametru i powiedzieć GCI, aby kontynuował dyskretnie po błędzie. Na przykład:

Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse -ErrorAction SilentlyContinue
Ƭᴇcʜιᴇ007
źródło
Dziękuję bardzo Techie007. To dla mnie niesamowite; ---- PowerShell nie ma sposobu na wykluczenie folderu i wszystkiego pod nim? wydaje się być tak podstawową przesłanką.
gsb005,
Niestety, $ mysys = 'c: \ windows *' nie działał, wciąż wygląda pod nim.
gsb005
"Unfortunately, $mysys = 'c:\windows\*' didn't work" Samo zrobienie tego niczego nie naprawi, to po prostu lepsza / właściwa składnia dla „wszystkiego zaczynającego się od 'c: \ windows \'”. :)
ᴇcʜιᴇ007
Techie007, czy możesz rzucić nieco światła tutaj, czy możesz mi powiedzieć, czy jakoś użycie $ env: SystemRoot, parametr w powyższym skrypcie przyniesie pozytywne wyniki?
gsb005,
Używanie $env:SystemRootzmiennej środowiskowej jest lepsze, jeśli będziesz ponownie używać skryptu (na różnych komputerach), ponieważ system Windows można zainstalować w innym miejscu niż to c:\windows, dlatego ta zmienna systemowa istnieje. :) Powiedziawszy to, użycie tej zmiennej zamiast c:\windowsw danym kodzie nie robi różnicy.
Ƭᴇcʜιᴇ007