我經常收到一個 CSV 檔案,并要求我向其中添加資訊。對于一個簡化的示例,我可能會收到以下 CSV 并要求獲取每個用戶的lastlogontimestamp

為了實作這一點,我做了以下
$csv = import-csv users.csv
$report = "User Audit_{0:dd-MM-yyyy_HHmm}.csv" -f (Get-Date)
$csv | ForEach-Object {
$user = ""
$user = get-aduser $_.user -Properties lastlogontimestamp | Select-Object @{ N = 'LastLogonTimestamp'; E = { [DateTime]::FromFileTime($_.LastLogonTimestamp) } }
[pscustomobject]@{
User = $_.User
'First Name' = $_.'First Name'
'Last Name' = $_.'Last Name'
'LastLogonTimestamp (AD)' = $user.lastlogontimestamp
} | Export-Csv $report -NoTypeInformation -Append
}
這非常有效,但是對于具有大量行的電子表格,創建它可能很耗時,并且在 pscustomobject 構造程序中會出現人為錯誤。所以我的問題是 - 除了手動構建 pscustomobject 之外,有沒有辦法對其進行編碼(使用行標題來填充每個鍵和值),然后我可以附加我的新添加?
uj5u.com熱心網友回復:
您可以使用Select-Objectwith*復制所有現有列并使用計算屬性添加新列:
$report = "User Audit_{0:dd-MM-yyyy_HHmm}.csv" -f (Get-Date)
import-csv users.csv | ForEach-Object {
$user = get-aduser $_.user -Properties lastlogontimestamp
$_ | Select-Object *,
@{ N = 'LastLogonTimestamp (AD)'; E = { [DateTime]::FromFileTime($user.LastLogonTimestamp) } }
} | Export-Csv $report -NoTypeInformation
此外,正如Mathias R. Jessen所建議的,移動Export-Csv到管道的末端并移除-Append以提高性能。否則檔案將為每一行打開和關閉,這非常慢。
我還冒昧地稍微重構了代碼以洗掉Select-Object不再需要的第一條陳述句。您也可以Import-Csv直接通過管道輸入ForEach-Object,而無需使用臨時變數。
uj5u.com熱心網友回復:
它耗時的部分原因是您要為每個用戶附加結果。您可以通過簡單地將所有結果分配給一個變數然后在最后將這些結果匯出到 CSV 來減少花費的時間,如下所示:
$csv = import-csv users.csv
$report = "User Audit_{0:dd-MM-yyyy_HHmm}.csv" -f (Get-Date)
$results = $csv | ForEach-Object {
$user = ""
$user = get-aduser $_.user -Properties lastlogontimestamp | Select-Object @{ N = 'LastLogonTimestamp'; E = { [DateTime]::FromFileTime($_.LastLogonTimestamp) } }
[pscustomobject]@{
User = $_.User
'First Name' = $_.'First Name'
'Last Name' = $_.'Last Name'
'LastLogonTimestamp (AD)' = $user.lastlogontimestamp
}
}
$results | Export-Csv $report -NoTypeInformation
您也可以一起忽略變數并將結果直接傳遞給Export-Csv
$csv = import-csv users.csv
$report = "User Audit_{0:dd-MM-yyyy_HHmm}.csv" -f (Get-Date)
$csv | ForEach-Object {
$user = ""
$user = get-aduser $_.user -Properties lastlogontimestamp | Select-Object @{ N = 'LastLogonTimestamp'; E = { [DateTime]::FromFileTime($_.LastLogonTimestamp) } }
[pscustomobject]@{
User = $_.User
'First Name' = $_.'First Name'
'Last Name' = $_.'Last Name'
'LastLogonTimestamp (AD)' = $user.lastlogontimestamp
}
} | Export-Csv $report -NoTypeInformation
在人為錯誤方面。我不確定您的代碼中究竟是什么“容易出現人為錯誤”,所以我無法在那里提出建議。
更新 - 這應該讓你得到你正在尋找的東西
$csv | ForEach-Object {
Get-AdUser $_.user -Properties lastlogontimestamp | Select-Object UserPrincipalName, SamAccountName, GivenName, SurName, @{ N = 'LastLogonTimestamp'; E = { [DateTime]::FromFileTime($_.LastLogonTimestamp) } }
} | Export-Csv $report -NoTypeInformation
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/483580.html
