【问题标题】:Script needs converting to export to CSV脚本需要转换为导出为 CSV
【发布时间】:2025-12-22 00:05:18
【问题描述】:

我把下面的东西放在一起,它可以完成这项工作。但是,输出不是很可行。所以我想使用Export-Csv 将这一切输出到CSV。我知道我可以通过转到ForEach-Object 查询来做到这一点,但我不完全确定如何实现。

我添加了一个转换它的尝试,希望能有所帮助。我不确定如何为每个对象指定变量。例如,第一部分调用林中的所有域。如何在下一个管道查询中使用每个响应?等等。

$domains = (Get-ADForest).Domains
$controllers = @()
$worked = $false

foreach ($domain in $domains) {
    $controller = Get-ADDomainController -Discover -ForceDiscover -DomainName $domain |
                  Select-Object HostName
    $controllers += $controller
}
while (-not $worked) {
    try {
        foreach ($item in $controllers) {
            $value = $item.HostName.Value
            Write-Host $value
            Write-Host 'Domain Admins'

            Get-ADGroupMember -Identity 'Domain Admins' -Server $value |
                Get-ADUser -Properties name, samaccountname, Description, EmailAddress |
                Where {$_.Enabled -eq $true} |
                Format-Table Name, SamAccountName, Description, EmailAddress -AutoSize
        }
        $worked = $true
    } catch {}
}

转换尝试

ForEach-Object{ 
(Get-ADForest).domains | Get-ADDomainController -Discover -ForceDiscover -DomainName $domain |Select-Object HostName |  Get-ADGroupMember -identity 'Domain Admins' -Server $value | Get-ADUser -Properties samaccountname, Description, EmailAddress | Where {$_.Enabled -eq $true} 
}| Export-Csv -Path "$HOME/Desktop/DomainAdmins.csv" samaccountname, Description, EmailAddress -AutoSize

【问题讨论】:

  • Format-Table 替换为Export-Csv -Append
  • 另外,你为什么使用$worked?这没有任何意义。
  • @4c74356b41 看看倒数第三行。该变量用于在 `foreach 循环运行且没有终止错误的情况下终止 while 循环。有点尴尬,但应该可以。
  • 我知道它应该可以工作,但它没有任何意义
  • @4c74356b41 确实有道理。 PowerShell interprets an empty/null variable as $false,因此循环继续,直到变量设置为 $true(或其他填充值)。

标签: powershell csv export-to-csv


【解决方案1】:

如果您可以从 Get-ADUser 调用中获取值并将它们放入对象中,则可以通过管道传输到 convertto-csv。

这是一个例子:

$arr = @([pscustomobject]@{name="name"; sam="samaccountname"}, [pscustomobject]@{name="name2"; sam="samaccountname2"});

$arr | ConvertTo-Csv -NoTypeInformation
"name","sam"
"name","samaccountname"
"name2","samaccountname2"

您可以摆脱 Format-Table 调用。我在 convertto-csv cmdlet 示例管道和对象数组中显示的代码。因此,如果 Get-ADUser 返回对象,您应该能够直接通过管道传输到 ConvertTo-CSV 或 Export-Csv -append

对象是转换为 pscustomobjects 的哈希表,这是一种很好的快速说明技术的方法。

如图所示,结果将是与您的哈希表键匹配的 csv 标头,而 hastable 值将是 CSV 值。

【讨论】:

    【解决方案2】:

    这在我的本地环境中运行良好,并将结果存储在 D:\Test_File.csv

    $domains = (Get-ADForest).Domains
    $controllers = @()
    $worked = $false
    foreach ($domain in $domains) {
    $controller = Get-ADDomainController -Discover -ForceDiscover -DomainName $domain | Select-Object HostName
    $controllers += $controller
    }
    while (-not $worked) {
    try 
    {
      foreach ($item in $controllers)
            {
            $value = $item.HostName.Value
            Write-Host $value
            Write-Host 'Domain Admins'
            Get-ADGroupMember -Identity 'Domain Admins' -Server $value |
                 Get-ADUser -Properties name, samaccountname, Description, EmailAddress |?{$_.Enabled -eq $true}|Export-Csv -Append "D:\Test_File.csv"
            }
        #$worked = $true
    }
    catch 
    {
    $Error_Message=$_.Exception.Message
    }
    }
    

    【讨论】:

    • 这部分有效,我只从 Get-ADUser 对象获取数据,我希望所有数据都进入 csv。那么这将包括域名,也许作为 csv 中的一个列?
    • @iNoob:您可以使用 Get-ADDomain 作为域名,您可以将其附加到 CSV 文件中,例如 " | Export-Csv -Append "D:\Test_File .csv"" 您可以使用(Get-WmiObject Win32_ComputerSystem).Domain 获取当前系统在哪个域下,您可以在CSV 中附加相同的内容。