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.


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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.