我有以下问题:
我有一个关于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 ...
在此处阅读有关计算属性的更多信息。