Powershell CSV排序导出,包含特定列



我有以下问题:

我有一个关于Get-ADUser的查询,并且有特定的字段要获取(仅测试查询(

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

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

$Language = "german"
$Comment = ""
$Link = ""
$gender = ""
$exportto = "C:TempExport01.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

你能帮我吗?

出口必须有已订购的清单,而没有"订单"按照这个顺序。

谢谢。最大

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

要输出到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:TempExport01.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属性,就像上面的代码所做的那样

您的代码中存在一些高级问题。

分配不正确

在代码中,应该将值分配给$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

不使用"选择对象"计算的特性

一般来说,您可以将代码缩短为一行,如:

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

在此处阅读有关计算属性的更多信息。

相关内容

  • 没有找到相关文章

最新更新