Come escludere la directory di sistema usando Powershell


1

Voglio un modo semplice per escludere la cartella di sistema dalle ricerche in PowerShell.

Uso il seguente script:

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

Fondamentalmente voglio che qualsiasi cosa in c: \ windows venga completamente ignorata, tuttavia, quando eseguo la ricerca, ricevo continuamente errori mentre cerca in c: \ windows; e in alcuni casi fornisce anche risultati trovati.

Errore: (perché sta andando anche sotto c: \ windows quando l'ho escluso)

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

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

Ad esempio, include: (dovrebbe essere escluso tutto) (praticamente tutto sotto 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

Fondamentalmente voglio fare una ricerca ricorsiva sotto c: \ e quindi escludere tutto ciò che non voglio. A partire da c: \ windows e tutto sotto di esso.


L'opzione -exclude di Get-ChildItem funziona solo sulle foglie, non sugli elementi del percorso. Dovrai reindirizzare verso un punto da escludere.
LotPings

Puoi farmi un esempio?
gsb005,


Questo era esattamente quello che stavo cercando @Lotpings !! Grazie!!
gsb005,

Sentiti libero di votare questa risposta ;-)
LotPings

Risposte:


0

Suggerisci un paio di correzioni minori della sintassi (queste modifiche non risolveranno il tuo problema, è solo una migliore sintassi):

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

Comunque...

perché sta andando anche sotto c: \ windows quando l'ho escluso

Stai escludendo le cose in "C: \ windows" dai risultati di Get-ChildItem. GCI deve ancora controllare nelle cartelle che gli hai detto di controllare, per vedere se qualcosa corrisponde, causando l'errore Accesso negato.

Se si desidera evitare completamente le cartelle a cui non si ha accesso, è necessario creare un elenco di cartelle che si desidera verificare con GCI, anziché semplicemente dire a GCI di controllare tutto nel percorso corrente.

L'unico modo per farlo è sostanzialmente la stessa procedura: controlla ogni cartella e mantieni un elenco di quelli su cui non hai negato l'accesso, quindi usa quell'elenco con GCI. Alla fine stai ancora tentando di accedere alle cartelle (e lanciare l'errore) comunque, quindi non c'è praticamente alcun guadagno nel farlo (aspettati ulteriore complessità).

Se non ti piace vedere gli errori rossi durante l'esecuzione del comando , puoi utilizzare il -ErrorActionparametro e dire a GCI di continuare silenziosamente in caso di errore. Per esempio:

Get-ChildItem -path . -Include *.txt -Exclude $mysys -Recurse -ErrorAction SilentlyContinue

Grazie mille Techie007. È sorprendente per me quello; ---- PowerShell non ha un modo per escludere una cartella e tutto ciò che c'è sotto? sembra una premessa di base.
gsb005

Sfortunatamente, $ mysys = 'c: \ windows *' non ha funzionato, sta ancora cercando sotto di esso.
gsb005

"Unfortunately, $mysys = 'c:\windows\*' didn't work" Solo fare ciò non risolverà nulla, è solo una sintassi migliore / corretta per "tutto a partire da 'c: \ windows \` ". :)
Ƭᴇcʜιᴇ007

Techie007, puoi per favore far luce un po 'qui, per favore dimmi se in qualche modo usando $ env: SystemRoot, il parametro nello script sopra porterà risultati positivi?
gsb005,

L'uso della $env:SystemRootvariabile d'ambiente è meglio usare se riutilizzerai lo script (su diversi computer), poiché Windows può essere installato in una posizione diversa da c:\windows, quindi perché esiste quella variabile di sistema. :) Detto questo, l'utilizzo di tale variabile anziché c:\windowsnel codice in questione non farà alcuna differenza.
Ƭᴇcʜιᴇ007,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.