2013-02-15 118 views
5

我是Powerhell的新手,需要幫助。我的第一個工作腳本是使AD環境中的新用戶和被稱爲用戶自動化。Powershell - 組合陣列

CSV轉儲將從我們的Peoplesoft系統每天完成一次。我使用Import-CSV並創建3個數組(新的,術語和處理)。

我遇到的麻煩是將3個數組組合在一起,我通過所有用戶循環並嘗試將其放回到文件中。代碼在$New += $Term行中斷。我相信這是由於我的測試文件中每個用戶類型(新,術語和處理)只有1條記錄(我知道,增加更多用戶,不能,這對於任何用戶來說都是真實世界的結果特定的日子)。以下是我的示例代碼:

#Get Credentials from user 
$c = Get-Credential 

#Get Date for $Term array population 
$e = Get-Date -format M/d/yyyy 

#Set file location and variable for said file 
$File = "c:\users\nmaddux\desktop\adduserstuff\test.csv" 

#Import record sets for New and Term users 
$New = @() 
$Term = @() 
$Procd = @() 
$New = Import-Csv $File | Where-Object { 
      $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq "" 
     } 
$Term = Import-Csv $File | Where-Object { 
      $_.TermDate -ne "" -and $_.Processdate -eq "" -and $_.TermDate -le $e 
     } 
$Procd = Import-Csv $File | Where-Object { $_.Processdate -ne "" } 

#Process both new and term users provided there are records to process for each 
If ($New -ne $NULL -and $Term -ne $NULL) { 
    # Some code to process users 
} 

$new += $term 
$new += $Procd 
$new | Export-Csv $file -NoTypeInformation -ErrorAction SilentlyContinue 

所以它會導出,但只有部分結果。

錯誤 - 方法調用失敗,因爲[System.Management.Automation.PSObject]不包含名爲'op_Addition'的方法。

+1

'$ New + = $ Term'那條線是哪裏......? – aquinas 2013-02-15 21:57:32

+0

添加了代碼和錯誤聲明......我的歉意。 – user2077056 2013-02-15 23:18:03

回答

11

如果Import-Csv只返回1個結果,那麼你認爲你的變量被認爲不是一個數組,那麼連接將失敗。這並不是因爲你已經用@()預先初始化了你的變量。實際上,這一步並非必要。

要強制將結果視爲一個數組,您可以將整個Import-Csv行包裝在@()中,或者在之後做類似的事情。

$new = @(Import-Csv $File | Where-Object {...}) 
# or 
$new = Import-Csv $File | Where-Object {...} 
$new = @($new) 
+0

非常好,謝謝!我會嘗試。 附註,我試圖把它全部發送到一個新的陣列....即 '$ total = @()' $ total + = $ new $ total + = $ term 然後導出$總共 它返回了我測試文件中的所有三個用戶。爲什麼這個工作,而不是原來的? – user2077056 2013-02-15 23:13:23

+1

在這種情況下,您將'$ total'初始化爲一個數組,然後立即對其進行「加 - 平等」操作。所以PowerShell知道你正在做一個數組操作,並採取適當的行動。在您的原始代碼中,您將'$ new'初始化爲一個數組,但在執行plus-equals之前將其重新分配給cmdlet的輸出。如果cmdlet只返回1個值,那麼powershell會將'$ new'更改爲標量變量,然後加上等於沒有意義。 – latkin 2013-02-16 00:04:32

+1

'$ a = @($ b)+ @($ c)'爲我解決了類似的問題。感謝您的有用答案@latkin。 – kevinmicke 2014-01-31 21:30:14

0

您還可以通過類型轉換變量執行類型:

$array = @() 
$array = gci test.txt 
$array.GetType() 

[array]$array = @() 
$array = gci test.txt 
$array.GetType() 

IsPublic IsSerial名稱BASETYPE
-------- -------- --- - --------
真真FileInfo的System.IO.FileSystemInfo
真真對象[]的System.Array

1

所以要導入同一CSV˚F ile 3次?將它導入一次然後將數組設置爲過濾它的「視圖」不是更好嗎?

有點像這樣。您還應該能夠使用每個數組中的「Count」值來說明是否返回了一個或多個結果。

#Get Credentials from user 
$c = Get-Credential 

#Get Date for $Term array population 
$e = Get-Date -format M/d/yyyy 

#Set file location and variable for said file 
$File = "c:\users\nmaddux\desktop\adduserstuff\test.csv" 

#Import record sets for New and Term users 
[array]$New 
[array]$Term 
[array]$Procd 

[array]$Import = Import-Csv $File 
[array]$New = $Import | ? {$_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq ""} 
[array]$Term = $Import | ? {$_.TermDate -ne "" -and $_.Processdate -eq "" -and $_.TermDate -le $e} 
[array]$Procd = $Import | ? {$_.Processdate -ne ""} 

#Process both new and term users provided there are records to process for each 
if (($New.Count -gt 0) -and ($Term.Count -gt 0)) 
{ 
    # Some code to process users 
} 

$new += $term 
$new += $Procd 
$new | Export-Csv $file -NoTypeInformation -ErrorAction SilentlyContinue 
0

我知道我來到這個討論較晚,但別人說走來...... 既然你已經定義$新的空數組,當您從CSV導入要添加輸出到您的預定義數組,不會將其設置爲等於import-csv的輸出。

$new = @() 
$new += Import-Csv $File | Where-Object { 
      $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq "" 
     }