從 Powershell 產生錯誤日誌

從 Powershell 產生錯誤日誌

我創建了一個腳本,以根據 CSV 文件內的列表協助在廣泛的資料夾結構內進行批量編輯權限。該腳本按預期工作,但對於其中幾個資料夾,我知道該腳本應該失敗並拋出錯誤,因為該資料夾不存在。但是,除了運行列表之外,我沒有從腳本中得到任何輸出,我必須通知我當前資料夾。我嘗試過 Try-Catch,但腳本在出現第一個錯誤時停止處理,我不確定如何設計 Catch 以使腳本繼續運行。保持腳本處理的最佳方法是什麼,但我知道文件中存在輸出錯誤,以便我以後可以查看它們?

例如,當程式碼運行時,它應該在資料夾 1-3 上運行。如果資料夾 2 不存在,Powershell 會拋出找不到路徑的錯誤並繼續。我希望稍後解析文件中的錯誤,因為某些資料夾不遵循此腳本修改的結構。

$CSV=Import-Csv "C:\ProjectList.csv"

ForEach ($Entry in $CSV)

{

$ProjectNumber = $Entry.Projects
$Project = "$ProjectMain\$ProjectNumber"

Write-Host $Project  #Writes out current project being processed

#sddl defines

$sddlProject = 'D:PAI(D;CI;DCLCSDWDWO;;;DU)(D;CI;DCLCSDWDWO;;;S-1-5-21-513)(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;FA;;;DA)(A;OICI;0x1200a9;;;DU)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;0x1200a9;;;S-1-5-21-513)'

$sddlRootFolders = 'D:PAI(D;;SDWDWO;;;DU)(D;;SDWDWO;;;S-1-5-21-513)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;DU)(A;OICI;FA;;;BA)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;0x1301bf;;;S-1-5-21-513)'

$sddlCommon = 'D:AI(A;ID;FA;;;BA)(A;OICIIOID;FA;;;CO)(A;OICIID;FA;;;SY)(A;OICIID;FA;;;DA)(A;OICIID;0x1301bf;;;DU)(A;OICIIOID;FA;;;BA)(A;OICIID;FA;;;S-1-5-21-512)(A;OICIID;0x1301bf;;;S-1-5-21-513)'

$sddlMGMT = 'D:PAI(A;OICI;0x1301bf;;;S-1-5-21-1501)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12461)(A;OICI;0x1301bf;;;S-1-5-21-12462)(A;OICI;0x1301bf;;;S-1-5-21-12463)(A;OICI;0x1301bf;;;S-1-5-21-12464)(A;OICI;0x1301bf;;;S-1-5-21-12465)(A;OICI;0x1301bf;;;S-1-5-21-12466)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1486)(A;OICI;0x1301bf;;;S-1-5-21-1487)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'


$sddlFiles = 'D:AI(A;ID;FA;;;BA)(A;ID;FA;;;SY)(A;ID;FA;;;DA)(A;ID;0x1301bf;;;DU)(A;ID;FA;;;S-1-5-21-512)(A;ID;0x1301bf;;;S-1-5-21-513)'


#Apply ACL to main folder

$securityDescriptor = Get-Acl -Path $Project
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlProject)
Set-Acl -Path $Project -AclObject $securityDescriptor 


#Apply ACL to the top tier folders

$ProjectSub = $Project + "\Folder1"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

$ProjectSub = $Project + "\Folder2"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

$ProjectSub = $Project + "\Folder3"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

#Apply ACL to MGMT folders

$ProjectSub = $Project + "\Folder9"

$ProjectDiscSub = $ProjectSub + "\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub 
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMT)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

#Apply ACL to MGMT inside folders

$ProjectDiscSub = $Project + "\Folder1\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub
$sddlMGMTSub = 'D:PAI(D;;SDWDWO;;;S-1-5-21-12471)(D;;SDWDWO;;;S-1-5-21-1497)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12471)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1497)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMTSub)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

$ProjectDiscSub = $Project + "\Folder3\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub
$sddlMGMTSub = 'D:PAI(D;;SDWDWO;;;S-1-5-21-12469)(D;;SDWDWO;;;S-1-5-21-1501)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12469)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1501)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMTSub)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

}

答案1

有幾種處理此類錯誤的策略。

-ErrorAction第一個是為可能失敗的命令新增一個參數。

第二種是將指令包裝在 try/catch 中:

$ProjectSub = $Project + "\Folder2"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
try {
    Set-Acl -Path $ProjectSub -AclObject $securityDescriptor
} catch {
    "Poo"
}
"Do more"

請注意,在這兩種情況下,您仍然會收到標準錯誤訊息,但執行會繼續。在前一種情況下,執行將移至下一行。在 try/catch 中,catch 被執行(列印「Poo」),然後執行下一行(「Do More」)。如果您只想在失敗時執行某些操作(例如將一些詳細資訊儲存到不同的檔案以供以後處理),那麼您才真正需要 try/catch。

在您的情況下,假設處理清單不太大,您可以在 catch 中建立自訂對象,以將不存在的文件詳細資訊累積到變數中。然後在腳本末尾,將變數寫入檔案。只要注意變數變得太大即可。我的腳本有數十萬個結果,佔用了大量記憶體!

相關內容