2013-02-15 35 views
5

私はpowershellを使い慣れていないので、助けが必要です。私の仕事のための最初のスクリプトは、AD環境で新しいユーザーと呼ばれるユーザーを自動化することです。Powershell - アレイを組み合わせる

CSVダンプはPeoplesoftシステムから毎日1回実行されます。 Import-CSVを使用して、3つの配列(new、term、およびprocessed)を作成します。

私が抱えている問題は、すべてのユーザーを1回ループして3つのアレイを結合し、ファイルに戻してみることです。コードは$New += $Term行で改行されます。これは、テストファイルに各ユーザータイプ(新規、期間、処理済み)のレコードが1つしかないことが原因であると私は考えている(私は知っている、より多くのユーザーを追加&hellipすることはできない。特定の日)。以下は私のサンプルコードです:

#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

+0

コードとエラーステートメントを追加しました...謝罪します。 – user2077056

答えて

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 次に、合計$ をエクスポートして、3人のユーザーをすべてテストファイルに返しました。なぜこれは元の作品ではなく機能しますか? – user2077056

+1

この場合、 '$ total'を配列として初期化してから、直ちに「plus-equal」を行います。だからpowershellはあなたが配列操作をしていることを知っていて、適切に動作します。元のコードでは、 '$ new'を配列として初期化しますが、plus-equalsを実行する前に、それをコマンドレットの出力に再割り当てします。コマンドレットが1つの値しか返さなかった場合、powershellは '$ new'をスカラー変数に変更し、plus-equalsは意味をなさないでしょう。 – latkin

+1

'$ a = @($ b)+ @($ c)'は私にとっても同様の問題を解決しました。役立つ答え@latkinをありがとう。 – kevinmicke

0

ます。また、変数を型キャストによってタイプを強制することができます

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

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

IsPublic IsSerial名前BaseType
-------- -------- --- - --------
TRUE TRUEのFileInfo System.IO.FileSystemInfo
真の真のオブジェクト[]のSystem.Array

1

ですから、同じCSV Fをインポートしますile 3回?それを一度インポートし、配列をフィルタリングされた "ビュー"に設定する方がいいですか?

このような並べ替えのような。 1つ以上の結果が返されたかどうかを言うために、各配列の "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 "" 
     }