2016-03-11 19 views
0

我有一個csv文件,該腳本可以正常工作。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,並希望使用正則表達式,事情不起作用。它似乎掛起或當它運行時,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

在你的第二個例子中$sn將是空的。這是因爲你有尾隨的管道特徵。此問題也出現在您的第一個代碼塊$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屬性名,屬性名。如果您嘗試訪問,您將得到一個空值。 GivenName,SurnameSID是默認返回的值集的一部分,因此您不需要需要來請求它們。

看着about_ActiveDirectory_ObjectModel您將在ADUser便有看到:

姓 - System.String類型的屬性,從目錄屬性導出:SN

你仍然會得到錯誤,這個如果Surname或GivenName未填充。如果這將成爲一個問題,那麼對此進行會計將是一個簡單的if語句。

+0

奇怪,我得到一個錯誤你不能調用一個空值表達式的方法。 在C:\ Scripts \ CCure \ Get-AD-Names.ps1:6 char:5 + $ props = @ { + ~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull – MarcGel

+0

不,他們沒有。 – MarcGel

+0

@MarcGel請閱讀我更新的答案與調整後的代碼。對於那個很抱歉。 Ahkk ...我的廣告中有一些空字段。如果你不這樣做,你應該沒問題。也許我們應該說明這一點。 – Matt