2017-08-17 48 views
1

我想從Active Directory獲取用戶。用戶列表顯示在文件users.txt中。我在做批量查詢時,我想在CSV中導出所有詳細信息,同時保留標題(列名稱)。另外我想處理文件errors.txt中的錯誤。

這裏是從我的代碼片段:

$Users = Get-Content .\users.txt 
try { 
    $Users | Get-ADUser -Properties * | select * | Export-Csv export.csv 
} catch { 
    $_ | Out-File errors.txt -Append 
} 

但我不是在文件中得到了屏幕上的錯誤。例如:

 
Get-ADUser : Cannot find an object with identity: 'admin' under: 
'DC=test,DC=dev,DC=net'. 
At line:2 char:14 
+  $Users | Get-ADUser -Properties * | select * | Export-Csv export.csv 
+    ~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (admin:ADUser) [Get-ADUser], ADIdentityNotFoundException 
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUser 

我不想使用一個循環像foreach因爲我不能追加到CSV文件。此外,我失去了列名。

問題是我如何處理文件中的錯誤,當我爲多個用戶執行$Users | Get-ADUser

+0

爲什麼不能追加到CSV? –

回答

1

這很可能是因爲您的ErrorAction設置不正確。只需在您的Get-ADUser命令中添加-ErrorAction Stop並查看是否可以解決問題。否則它可能不會激活你的捕獲。

詳細說明,您在屏幕上看到的錯誤很可能不是終止錯誤,因此它不會激活您的catch,因此指定-ErrorAction Stop將導致無終止錯誤進入捕獲和捕獲你在文本文件中的錯誤。但是,如果您不希望管道在此期間終止,請閱讀下面的編輯。

編輯,我意識到你可能不希望你的管道在發生非終止錯誤時終止。如果是這種情況,你需要改變幾件事情。

#Start by clearing out errors before you execute your pipeline code. Do not put a try catch on it. 
$Error.Clear() 
$Users | Get-ADUser -Properties * -ErrorAction SilentlyContinue | select * | Export-Csv export.csv 
$Error | Out-File C:\TEMP\errors.txt -Append 
0

的錯誤是non-terminating errors,使它們不會被抓到try..catchRedirect從(可能)失敗的命令向文件輸出錯誤,並將其餘部分留給管道。順便說一句,select *是無用的,所以只要刪除該部分。

$Users | 
    Get-ADUser -Properties * 2>> 'errors.txt' | 
    Export-Csv 'export.csv' -NoType