5

私はPowerShellを初めて使用し、助けを必要としています。私の最初の仕事のスクリプトは、AD環境で新しいユーザーと呼ばれるユーザーを自動化することです。

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

私が抱えている問題は、すべてのユーザーをループしてファイルに戻そうとしたら、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」という名前のメソッドが含まれていないため、メソッドの呼び出しに失敗しました。

4

4 に答える 4

11

Import-Csv1つの結果しか返さない場合、変数が配列ではないと想定されていることは正しいため、連結は失敗します。これは、変数を で事前に初期化したという事実によって変更されることはありません@()。実際、その手順は必要ありません。

Import-Csv結果を強制的に配列として処理するには、行全体を で囲むか、@()後で同様のことを行います。

$new = @( Import-Csv $File | Where-Object {...} )
# or
$new = Import-Csv $File | Where-Object {...}
$new = @($new)
于 2013-02-15T22:02:31.400 に答える
1

同じ CSV ファイルを 3 回インポートしていますか? 一度インポートしてから、配列をフィルター処理された「ビュー」に設定する方がよいのではないでしょうか?

このようなものです。また、各配列の「カウント」値を使用して、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
[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
于 2013-02-17T21:36:48.220 に答える
0

変数を型キャストすることで、型を強制することもできます。

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

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

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True FileInfo System.IO.FileSystemInfo
True True Object [] System.Array

于 2013-02-16T04:06:37.060 に答える
0

私はこの議論に遅れて参加していることを知っていますが、一緒に来る他の誰かのために... $new を空の配列として既に定義しているので、csv からインポートするときに、事前定義された配列に出力を追加します。 import-csv の出力と同じに設定しないでください。

$new = @()
$new += Import-Csv $File | Where-Object {
           $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq ""
         }
于 2013-11-08T20:12:20.647 に答える