2011-08-04 8 views
7

forループでGetChildItemを使用してファイルシステムを再帰的に実行するPowerShellスクリプトがあります。それが移動すると、ACLの問題を解決しています(主に誰かがBUILTIN \ Administratorsアカウントをブロックした場所)...しかし、そこには[System.UnauthorizedAccessException]があるときのように、それ自体では処理できないものがあります明示的な「拒否」ACEです。PowerShellはGetChildItemでエ​​ラーをトラップしてループを継続できますか?

コードの行は次のようになります。

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction Continue) { 
    ... 
} 

それは読むことができない道につまずくと、それはこの例外を与える:

は、Get-ChildItemコマンドレットを:パスへのアクセスを'C:\ TEMP \ denied'は拒否されました。 52文字:31 + foreachの($のGet-ChildItemコマンドレット<でファイル< < < $ dirRoot -Recurse -ErrorAction 続行){ + CategoryInfo:PermissionDenied: (C:\ tempに\拒否 修正-ACLs.ps1で:文字列)[ゲット-ChildItemコマンド]、無断にAccessException + FullyQualifiedErrorId: DirUnauthorizedAccessError、Microsoft.PowerShell.Commands.GetChildItemCommand

私は(私はACLを修復することができるように/キャッチまたはトラップエラーを試してみたいですつまり、「拒否」を取り除く)、そして最も重要なのは、私のプラックを失うことなくループを続けることですe。私のための任意の提案?

+0

使用しているコードを与えてください – manojlds

答えて

8

silentlycontinueを使用しましたか?

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction silentlycontinue) { 
    ... 
} 
+0

確かに私は持っています...しかし、それでもコードブロックには多くのエラーがあります。 'trap'と' try/catch'は一般に「Stop」エラーで動作するので、私が今までに見つけた最良の選択肢は、あなたが提案したように '-ErrorAction SilentlyContinue'を使用してから、コードの最初の行にif($ error){...}でエラーが発生したかどうかをブロックします。 – ewall

5

お問い合わせはどうですか?

エラーをトラブルシューティングするために2番目のPSウィンドウを開き、最初のPSウィンドウでYを選択して続行します。

またErrorVariable

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorVariable a) { 
... 
} 

を使用することができます。Get-変数Aまたは$はあなたのコマンドによって発生したすべてのエラーを表示します。 + variablename(+ a)を使用して、既存の変数にエラーを追加することもできます。

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorVariable +a) { 
... 
} 
+0

良いアイデア、@ Jesse。ありがとう! – ewall

関連する問題