Powershell CSV导出在其中一列中缺少数据
我有一个csv文件,这个脚本可以很好地工作Powershell CSV导出在其中一列中缺少数据,powershell,active-directory,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]
$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
}
然而,当我尝试一个类似的脚本去广告,并希望使用正则表达式,事情不工作。它似乎挂着,或者当它运行时,姓氏就不见了。为什么第二个不起作用?我一定错过了一些简单的东西
$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
}
在第二个示例中,
$sn
将为空。这是因为您使用了尾随管道字符。此问题也出现在$EmpID
的第一个代码块中。最后一个命令Export CSV
不向输出流返回任何内容,因此两种情况下的变量都是$null
您正在获取$2Name.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
如果你正在改变属性名称和值,那么也要考虑创建自己的对象。这应该完成同样的事情,更容易阅读并利用管道
$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
您会注意到,我使用了$\uu.sunsame
作为所使用的属性名,因为PowerShell AD对象与其LDAP属性名不直接匹配。如果试图访问$\uxN.SN
,则会得到一个空值GivenName
、姓氏
和SID
是默认返回的值集的一部分,因此您无需请求它们
看看AdUser,你会发现:
姓氏-System.String类型的属性,派生自目录属性:sn
如果未填充姓氏或GivenName,您仍然会在这方面出错。如果这将成为一个问题,那么说明这一点将是一个简单的if声明 在第二个示例中,
$sn
将为空。这是因为您使用了尾随管道字符。此问题也出现在$EmpID
的第一个代码块中。最后一个命令Export CSV
不向输出流返回任何内容,因此两种情况下的变量都是$null
您正在获取$2Name.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
如果你正在改变属性名称和值,那么也要考虑创建自己的对象。这应该完成同样的事情,更容易阅读并利用管道
$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
您会注意到,我使用了$\uu.sunsame
作为所使用的属性名,因为PowerShell AD对象与其LDAP属性名不直接匹配。如果试图访问$\uxN.SN
,则会得到一个空值GivenName
、姓氏
和SID
是默认返回的值集的一部分,因此您无需请求它们
看看AdUser,你会发现:
姓氏-System.String类型的属性,派生自目录属性:sn
如果未填充姓氏或GivenName,您仍然会在这方面出错。如果这将成为一个问题,那么说明这一点将是一个简单的if声明 奇怪的是,我遇到了一个错误,您不能对空值表达式调用方法。在C:\Scripts\CCure\Get AD Names.ps1:6 char:5+$props=@{+~~~~~~~~~~~~~~+CategoryInfo:InvalidOperation:(:)[],RuntimeException+FullyQualifiedErrorId:InvokeMethodOnNull@MarcGel请阅读我的更新答案和调整后的代码。很抱歉。啊…我的广告中有一些空字段。如果你没有,你应该没事。也许我们应该对此负责。@Marggel为我所说的映射添加了一个技术参考。仍然会收到相同的错误。有超过21k个用户对象,所以我使用-properties samaccountname、givenname、sn,但你是说我需要姓氏吗?我也尝试过,但仍然没有成功。我将更改代码以添加更多步骤来帮助我进行调试。奇怪的是,我遇到了一个错误,你无法对空值表达式调用方法。在C:\Scripts\CCure\Get-AD-Names.ps1:6 char:5+$props=@{+~~~~~~~~~~~~~~~~+类别信息:无效操作:(:)[],RuntimeException+FullyQualifiedErrorId:InvokeMethodOnNull@MarcGel请阅读我的更新答案和调整后的代码。很抱歉。啊…我的广告中有一些空字段。如果你没有,你应该没事。也许我们应该对此负责。@Marggel为我所说的映射添加了一个技术参考。仍然会收到相同的错误。有超过21k个用户对象,所以我使用-properties-samaccountname、givenname、sn,但你是说我需要姓氏吗?我也尝试过,但仍然没有成功。我将更改代码以添加更多步骤来帮助我进行调试。