web-dev-qa-db-ja.com

Powershellを使用してシステムディレクトリを除外する方法

PowerShellでの検索からシステムフォルダを除外する簡単な方法が必要です。

次のスクリプトを使用します。

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

基本的に、c:\ windowsの下にあるものはすべて完全に無視したいのですが、検索を実行すると、c:\ windowsの下で検索するとエラーが発生し続けます。場合によっては、見つかった結果も表示されます。

エラー:(除外したときにc:\ windowsの下に表示されるのはなぜですか)

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

char:1 + Get-ChildItem-path。 -*。txtを含める-'$ mysys'を除外する-Recurse-Dept ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:PermissionDenied:(C:\ Windows\Syst ... es\WMI\RtBackup:String)[Get-ChildItem]、UnauthorizedAccessException + FullyQualifiedErrorId:DirUnauthorizedAccessError、Microsoft.PowerShell.Commands.GetChildItemCommand

たとえば、次のものが含まれます:(これはすべて除外する必要があります)(基本的に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

基本的に、c:\で再帰検索を実行してから、不要なものをすべて除外します。 c:\ windowsとその下のすべてから始まります。

1
gsb005

いくつかのマイナーな構文修正を提案します(これらの変更は問題を解決しません、それはより良い構文です):

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

とにかく...

除外したときにc:\ windowsの下に表示されるのはなぜですか

Get-ChildItemのresultsから「C:\ windows」にあるものだけを除外しています。 GCIは、チェックするように指示したフォルダーをチェックインして、一致するものがあるかどうかを確認する必要があります。これにより、アクセス拒否エラーが発生します。

アクセスできないフォルダを完全に避けたい場合は、GCIにすべてをチェックするように指示するのではなく、GCIでチェックするフォルダのリストを作成する必要があります現在のパス。

これを行う唯一の方法は、基本的に同じ手順です。すべてのフォルダーを確認し、アクセスが拒否されていないフォルダーのリストを保持してから、そのリストをGCIで使用します。結局、とにかくフォルダにアクセスしようとしている(そしてエラーをスローしている)ので、基本的にそれを行うことによる利益はありません(追加の複雑さを期待してください)。

コマンドの実行中に赤いエラーが表示されたくない場合は-ErrorAction パラメータを指定し、エラー時にサイレントに続行するようにGCIに指示します。例えば:

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