CSV导出缺少其中一列中的数据

时间:2016-03-11 00:13:24

标签: powershell active-directory

我有一个csv文件,这个脚本可以正常工作。

$CCure = Import-csv C:\Scripts\file1.csv

ForEach ($user in $CCure) {

    [string]$1Name = $User.FirstName
    [string]$2Name = $User.LastName
    [string]$GivenName = $1Name.Split(" ")[0]
    [string]$SN = $2Name.Split(",")[0]
    [string]$ID = $User.ObjectID
    [string]$EmpID = $User.Int5 |   
    Select @{Name="First Name";Expression={$GivenName}}, @{Name="Last Name";Expression={$SN}}, @{Name="CCure ObjectID";Expression={$ID}}, @{Name="CCure Int5 Row";Expression={$EmpID}} | 
    Export-csv C:\Scripts\CCure\CCure-Names-Test.csv -Append -notypeinformation
    }

然而,当我尝试使用类似的脚本进入AD并希望使用RegEx时,事情不起作用。它似乎挂起或运行时,SurName丢失。为什么第二个不起作用?我一定错过了一些简单的东西?

$Users = Get-ADUser -LDAPFilter "(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))" -properties samaccountname,givenname,sn
ForEach ($User in $Users) {

    [string]$1Name = $User.GivenName
    [string]$2Name = $User.SN
    [string]$GivenName = $1Name.Split(" ")[0]
    [string]$SN = $2Name.Split(",")[0] |
    Select @{Name="First Name";Expression={$GivenName}}, @{Name="Last Name";Expression={$SN}},@{Name="SID";Expression={$User.samaccountname}}| Export-Csv C:\scripts\ccure\AD-Active-Names3.csv -NoTypeInformation -append

}

1 个答案:

答案 0 :(得分:1)

在您的第二个示例中,$sn将为null。这是因为您具有尾随管道字符。此问题也出现在$EmpID的第一个代码块中。最后一个命令Export-CSV不返回输出流,因此两种情况下的变量都是$null

您正在获取$2Name.Split(",")[0]的结果并将其发送到管道中,然后该管道将不会用于Select-Object

所以简单的答案是删除管道字符,这两行现在将分开工作。

[string]$SN = $2Name.Split(",")[0] 
Select @{Name="First Name";Expression={$GivenName}}, @{Name="Last Name";Expression={$SN}},@{Name="SID";Expression={$User.samaccountname}}| Export-Csv C:\scripts\ccure\AD-Active-Names3.csv -NoTypeInformation -append

如果要更改属性名称和值,请考虑创建自己的对象。这应该完成同样的事情,更容易阅读和利用管道。

$Users = Get-ADUser -LDAPFilter "(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
$Users | ForEach-Object {
    $props = @{
        "First Name" = ($_.GivenName).Split(" ")[0]
        "Last Name" = ($_.SurName).Split(",")[0]
        "SID" = $_.samaccountname
    }

    New-Object -TypeName psobject -Property $props    
} | Select-Object "First Name","Last Name",SID |  Export-Csv C:\scripts\ccure\AD-Active-Names3.csv -NoTypeInformation 

您将注意到我使用$_.SurName作为属性名称,因为PowerShell AD对象不直接匹配其LDAP属性名称。如果您尝试访问$_.SN,则会获得空值。 GivenNameSurnameSID是默认返回的值集的一部分,因此您不需要 来请求它们。

查看about_ActiveDirectory_ObjectModel,您会在AdUser下看到:

  

Surname - System.String类型的属性,派生自directory属性:sn

如果未填充Surname或GivenName,您仍会遇到此错误。如果这将是一个问题,那么这将是一个简单的if语句。