2011-08-04 123 views
7

我有一個PowerShell腳本,通過使用GetChildItem在for循環中遞歸通過文件系統。當它傳播時,它正在修復它發現的ACL問題(主要是在某人阻止了BUILTIN \ Administrators帳戶的地方)......但是有一些它自己無法處理,就像當我得到[System.UnauthorizedAccessException]時如果存在是一個明確的「拒絕」ACE。PowerShell可以在GetChildItem中捕獲錯誤並繼續循環?

的代碼行看起來是這樣的:

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

當絆倒它無法讀取路徑上,它給出了這樣的例外:

GET-ChildItem:對路徑的訪問'C:\ TEMP \ denied'被拒絕。在 修復-ACLs.ps1:52字符:31 +的foreach(在GET-ChildItem < < < < $ dirRoot -Recurse -ErrorAction 繼續$文件){ + CategoryInfo:PermissionDenied: (C:\ TEMP \否認:字符串)[獲取-ChildItem],未經授權AccessException + FullyQualifiedErrorId: DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

我想嘗試/捕獲或捕獲錯誤,這樣我可以修復的ACL(即刪除「拒絕」),並且 - 最重要的是 - 繼續循環而不會丟失我的位置即對我有何建議?

+0

給出一些你正在使用的代碼 – manojlds

回答

8

你用過默默繼續嗎?

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

事實上,我有...但它仍然通過代碼塊運行更多的錯誤。由於'trap'和'try/catch'通常用於「Stop」錯誤,所以目前發現的最佳選擇是按照您的建議使用'-ErrorAction SilentlyContinue',然後在代碼的第一行塊檢查我們是否遇到了錯誤'if($ error){...'。 – ewall

5

如何諮詢?

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

也許打開第二個PS窗口來解決錯誤,則通過選擇Y代表繼續繼續在第一PS窗口的命令。

您還可以使用ErrorVariable

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

GET-變量或$一個會告訴你該命令所發生的所有錯誤。您也可以使用+ variablename(+ a)將錯誤添加到現有變量。

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

好主意,@Jesse。謝謝! – ewall

相關問題