Powershell 中的 AD 查询将结果合并到 .CSV 文件中

AD query in Powershell combine results in .CSV file

我正在尝试 运行 来自 PowerShell 的脚本以获取来自 2 个不同 OU 的用户。我正在尝试将其导出到 .CSV 文件中。但是,我正在使用的脚本并没有将两个 Ous 合并到一个文件中,我只获得了 1 个 OU 数据。

我正在使用的脚本:

$users = @()
$OU1 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"
$OU2 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"
$users  = Get-ADUser -Filter * -Searchbase $OU1 -Properties *|
Select-Object name, userPrincipalName, accountExpires, distinguishedName, physicalDeliveryOfficeName | export-csv -path "c:\users$env:USERNAME\desktop-OU-List.csv"
$users += Get-ADUser -Filter * -SearchBase $OU2 -Properties *|
Select-Object name, userPrincipalName, accountExpires, distinguishedName, physicalDeliveryOfficeName | export-csv -path "c:\users$env:USERNAME\desktop-OU-List.csv"

现在,当我取出导出选项时,我的脚本在 powershell 中工作,但我正在尝试导出它:

$users = @()
$OU1 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"
$OU2 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"
$users  = Get-ADUser -SearchBase $OU1
$users += Get-ADUser -SearchBase $OU2

Export-Csv 覆盖现有的输出文件,除非使用参数 -Append。所以你总是只得到第二个 Get-ADUser 查询的输出。

使用参数 -Append,您甚至不需要将 Get-ADUser 结果存储到中间数组 $users,因此脚本需要的内存更少。

$OU1 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"
$OU2 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"

# Create a new, empty file (clear any existing file)
$file = New-Item "c:\users$env:USERNAME\desktop-OU-List.csv" -Force

# Use parameter -Append to add to the existing CSV
Get-ADUser -Filter * -Searchbase $OU1 -Properties *|
    Select-Object name, userPrincipalName, accountExpires, distinguishedName, physicalDeliveryOfficeName | 
    export-csv -path $file.FullName -Append

# Use parameter -Append to add to the existing CSV
Get-ADUser -Filter * -SearchBase $OU2 -Properties *|
    Select-Object name, userPrincipalName, accountExpires, distinguishedName, physicalDeliveryOfficeName | 
    export-csv -path $file.FullName -Append

请注意,为了对称,我为两个 Get-ADUser 调用指定了 -Append,并使用 New-Item 清除任何先前 运行 的输出。这使代码更易于维护,因为您无需关心第一个 Get-ADUser 调用,当您在将来添加更多查询或删除现有查询时。


另一种方法是将两个 Get-ADUser 调用包装到一个脚本块中,以有效地附加它们的输出流。一个好处是我们可以去掉一些重复的代码。

$OU1 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"
$OU2 = "OU=Standard users,OU=US,DC=x1,DC=contoso,DC=com','OU=Standard users,OU=AS, DC=x1,DC=contoso,DC=com"

# Create a script block to append the output streams of both `Get-ADUser` calls.
& {
    Get-ADUser -Filter * -Searchbase $OU1 -Properties *
    Get-ADUser -Filter * -SearchBase $OU2 -Properties *

} | Select-Object name, userPrincipalName, accountExpires, distinguishedName, physicalDeliveryOfficeName | 
    Export-Csv -Path "c:\users$env:USERNAME\desktop-OU-List.csv"

& {使用call operator立即执行下面的脚本块。

最后一行结束了脚本块并将其输出(由两个 Get-ADUser 调用的串行组合输出组成)传送到 Select-Object,然后传送到 Export-Csv。不需要-Append,因为我们一次性写完文件。