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.
źródło
Odpowiedzi:
Zaproponuj kilka drobnych poprawek składniowych (te zmiany nie rozwiążą twojego problemu, to po prostu lepsza składnia):
W każdym razie...
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ć
-ErrorAction
parametru i powiedzieć GCI, aby kontynuował dyskretnie po błędzie. Na przykład:źródło
"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 \'”. :)$env:SystemRoot
zmiennej ś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ż toc:\windows
, dlatego ta zmienna systemowa istnieje. :) Powiedziawszy to, użycie tej zmiennej zamiastc:\windows
w danym kodzie nie robi różnicy.