【问题标题】:Powershell CSV ordered Export with specific columnsPowershell CSV有序导出与特定列
【发布时间】:2020-12-17 09:29:21
【问题描述】:

我有以下问题:

我有一个 Get-ADUser 查询,并且有特定的字段可以获取(仅测试查询)

$AllADUsers = get-aduser -Identity m.mustermann -Properties * | select mail, title, l, GivenName, Surname, company, department, mobile

我还必须在 CSV 中添加一些静态字段,如语言或注释,我为此采用了一些变量:

$Language = "german"
$Comment = ""
$Link = ""
$gender = ""
$exportto = "C:\Temp\Export01.csv"

比我想导出带有分隔符“:”的有序 UTF8 CSV 中的所有条目。 我做了一个 foreach 但我总是出错或不完整的列表 - 我向你展示我的代码(但我有错误)

Foreach ($ADUser in $AllADUsers) {

  $MailAddress = $ADUser.mail
  $FullName = "$ADUser.GivenName" + "$ADUser.Surname"
  $Title = $AdUser.Title
  $Location = $ADUser.l
  $Comment = $Comment
  $Link = $Link
  $MobilePhone = $ADUser.mobile
  $Language = $Language
  $Divison = $ADUser.Department
  $GivenName = $ADUser.GivenName
  $Surname = $ADUser.Surname 


}

$ADUser | Export-CSV -Path $exportto -NoTypeInformation -Delimiter ":" -Encoding UTF8

你能帮帮我吗?

导出必须带有有序列表,不带“”,并且按此顺序。

谢谢。 最大

【问题讨论】:

  • 您能否将问题隔离为一个问题,而不是提及您有错误?我认为您正在将值分配给变量,但您从不使用它们。快速提示:FullName 的公式应为 "$($ADUser.GivenName) $($ADUser.Surname)"
  • 对不起。问题是,我的 foreach 中没有导出。此外,我的值和变量不在导出 CSV 中。怎么了?我在循环中的导出命令不起作用,选择中的列在 csv 中,而不是来自我的循环
  • 您使用参数-Identity 的查询只能返回一个对象。所以你不需要循环。考虑在此处使用@robdy 的答案等计算属性。 ;-)
  • 我知道参数-Identity,这只是在我的示例中,在我的正确查询中,这是有更多结果的。

标签: powershell csv


【解决方案1】:

您的代码不起作用,主要是因为您正在创建一系列最终不会使用的变量。

要输出到 CSV,您需要收集具有属性的对象,而不是单个变量。 一种非常优雅的方法是使用[PsCustomObject] 语法创建这些对象,同时您设置属性的顺序构成了最终输出文件中的顺序。

使用冒号作为分隔符是不常见的,当其他应用程序需要阅读和理解它时可能会给您带来麻烦,但这取决于您。

另一件事是您似乎主要使用 LDAP 属性名称,其中 PowerShell 将其中大部分映射到更友好的属性名称(例如映射到 LDAP 'l' 的“City”)。

您的代码已修改:

# Get-ADUSer already returns these properties by default:
# DistinguishedName, Enabled, GivenName, Name, ObjectClass, ObjectGUID, SamAccountName, SID, Surname, UserPrincipalName

# your hardcoded static variables:
$Language = "german"
$Comment  = ""
$Link     = ""
$gender   = ""
$exportto = "C:\Temp\Export01.csv"

# these are the extra properties you want to fetch
$userprops = 'EmailAddress','Title','Company','City','Department','MobilePhone'

# if you want this for all users, remove "-Identity 'm.mustermann'" and use "-Filter *" instead
$result = Get-ADUser -Identity 'm.mustermann' -Properties $userprops | ForEach-Object {
    # output an object to be collected in variable $result
    # the order in which you put them also determines the field order in the CSV
    [PsCustomObject]@{
        MailAddress = $_.EmailAddress
        FullName    = $_.DisplayName
        Title       = $_.Title
        Company     = $_.Company
        Location    = $_.City
        Comment     = $Comment      # static field
        Link        = $Link         # static field
        MobilePhone = $_.MobilePhone
        Language    = $Language     # static field
        Department  = $_.Department
        GivenName   = $_.GivenName
        Surname     = $_.Surname
    }
}

$result | Export-CSV -Path $exportto -NoTypeInformation -Delimiter ":" -Encoding UTF8

关于Export-Csv的说明:

Export-Csv 将始终引用所有内容,无论是标题还是数据字段。

仅尝试删除 CSV 文件中的所有引号可能会导致字段顺序错位并使 csv 无法使用。
使用 PowerShell 版本 7,您可以选择使用参数 -UseQuotes AsNeeded,但对于旧版本,您可以使用我的函数 ConvertTo-CsvNoQuotes 安全地执行此操作

由于这段代码都是关于获取 AD 信息的,我不明白你为什么要在这里构造 FullName。只需像上面的代码一样使用在 AD 中设置的 DisplayName 属性

【讨论】:

  • 我现在将尝试在我的程序中导入(如果它有效) - 我会再次回答。
  • 如何使用您的函数转换不带引号的 CSV 并保持编码为 UTF8?使用该功能时,我遇到了特殊字符被破坏的问题(“ü”,“ä”)......
  • @max95 就像$result | ConvertTo-CsvNoQuotes -Delimiter ":" | Set-Content -Path $exportto -Encoding UTF8 一样使用它。该函数本身不会改变字符串编码,在 PowerShell 内部是 Unicode (UTF16)。
  • 完美。真的很感谢西奥。现在我想在 $result 命令中删除标题。如何? -NoTypeInformation 不起作用? ://
  • @max95 函数还有一个开关-NoHeaders,所以加那个ConvertTo-CsvNoQuotes -Delimiter ":" -NoHeaders就行了
【解决方案2】:

您的代码中有一些高级别的问题。

分配不正确

在您的代码中,您应该将值分配给$AdUser 的特定属性。比如:

foreach ($ADUser in $AllADUsers) {
  $ADUser.FullName = "$($ADUser.GivenName) $($ADUser.Surname)"
  $ADUser.Comment = $Comment
  $ADUser.Link = $Link
}

没有导出

目前您只导出最后一个条目,您应该通过管道将$AllADUsers 传递给Export-Csv

$AllADUsers| Export-CSV -Path $exportto -NoTypeInformation -Delimiter ":" -Encoding UTF8

不使用 Select-Object 计算属性

通常,您可以将代码缩短为单行代码,例如:

$AllADUsers | Select-Object @{n="Comment";{$Comment}},@{n="FullName";e={"$($ADUser.GivenName) $($ADUser.Surname)"}} ... | Export-CSV ...

Read more about calculated properties here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2017-06-24
    • 2015-07-25
    相关资源
    最近更新 更多