2012-01-27 15 views
0

私はpowershellにはかなり新しく、基本的にはプライマリ列に基づいて複数の.csvファイルを結合するスクリプトを作成しています。私はここからJoin-Collectionsスクリプトを使用しています:http://poshcode.org/1461同じpowershell関数を2回実行することができません。エラーが発生します

私は5つの.csvファイルを組み合わせる必要があるので、この機能を4回実行する必要があります。

最初の実行では正常に動作しますが、再度関数を実行しようとすると「cmd-letに指定されたオブジェクトがありません」というエラーが返されます。

デバッグしようとすると、文字通り行をコピー&ペーストして、変数名を変更して新しい変数を作成しました。

No object has been specified to the get-member cmdlet 
+ foreach($p) in $Second | gm <<<< -type Properties | Where { $p1 -notcontains  $_.Name } | select -expand Name) 

CSVデータはかなり単純です:私は根本的に間違って何かをしなければなりません

...

$SumFile = "VMSummary.csv" 
$MemFile = "VMMemory.csv" 
$ProcFile = "VMProcessor.csv" 
$OSFile = "VMOS.csv" 
$NicFile = "VMNics.csv" 

$SumFileCSV = Import-Csv $SumFile | Select VMElementName,GuestOS,Heartbeat,MemoryUsage,IpAddress 
$MemFileCSV = Import-Csv $MemFile | Select VMElementName,Reservation 
$ProcFileCSV = Import-Csv $ProcFile 
$OSFileCSV = Import-Csv $OSFile 
$NicFileCSV = Import-Csv $NicFile 

$JoinColumn = "VMElementName" 

function Join-Collections { 
PARAM(
    $FirstCollection 
, [string]$FirstJoinColumn 
, $SecondCollection 
, [string]$SecondJoinColumn=$FirstJoinColumn 
) 
PROCESS { 
    $ErrorActionPreference = "Inquire" 
    foreach($first in $FirstCollection) { 
     $SecondCollection | Where{ $_."$SecondJoinColumn" -eq $first."$FirstJoinColumn" } | Join-Object $first 
    } 
} 
BEGIN { 
    function Join-Object { 
    Param(
     [Parameter(Position=0)] 
     $First 
    , 
     [Parameter(ValueFromPipeline=$true)] 
     $Second 
    ) 
    BEGIN { 
     [string[]] $p1 = $First | gm -type Properties | select -expand Name 
    } 
    Process { 
     $Output = $First | Select $p1 
     foreach($p in $Second | gm -type Properties | Where { $p1 -notcontains $_.Name } | select -expand Name) { 
     Add-Member -in $Output -type NoteProperty -name $p -value $Second."$p" 
     } 
     $Output 
    } 
    } 
} 
} 

$Temp = Join-Collections $SumFileCSV $JoinColumn $MemFileCSV $JoinColumn 

$Temp 

##BREAKS HERE 
$Temp2 = Join-Collections $SumFileCSV $JoinColumn $MemFileCSV $JoinColumn 

UPDATEは

これは、次のエラーが発生します。私はそれが壊れる直前に$の温度をプリントアウトすると、それが吐き出す:

GuestOS  : Windows Server (R) 2008 Standard 
Heartbeat  : OK 
IpAddress  : 192.168.48.92 
MemoryUsage : 1024 
VMElementName : VM015 
Reservation : 1024 

GuestOS  : Windows Server (R) 2008 Standard 
Heartbeat  : OK 
IpAddress  : 192.168.48.151 
MemoryUsage : 1028 
VMElementName : VM053 
Reservation : 1028 

GuestOS  : Windows Server (R) 2008 Standard 
Heartbeat  : OK 
IpAddress  : 192.168.48.214 
MemoryUsage : 3084 
VMElementName : VM065 
Reservation : 3084 

GuestOS  : 
Heartbeat  : 
IpAddress  : 
MemoryUsage : 
VMElementName : VM074 
Reservation : 1024 

GuestOS  : Windows Server 2008 R2 Standard 
Heartbeat  : OK 
IpAddress  : 192.168.48.32 
MemoryUsage : 3072 
VMElementName : VM088 
Reservation : 3072 

GuestOS  : Windows Server (R) 2008 Enterprise 
Heartbeat  : OK 
IpAddress  : 192.168.48.81 
MemoryUsage : 3084 
VMElementName : VM090 
Reservation : 3084 

GuestOS  : Windows Server 2008 R2 Enterprise 
Heartbeat  : OK 
IpAddress  : 192.168.48.82 
MemoryUsage : 5120 
VMElementName : VM106 
Reservation : 5120 

を.CSVデータの残りの部分はものと同じ種類のである - ちょうど別のサーバー上で統計。

は、理想的には私が何をしたいのか、このです:

$Temp = Join-Collections $SumFileCSV $JoinColumn $MemFileCSV $JoinColumn 

$Temp = Join-Collections $Temp $JoinColumn $ProcFileCSV $JoinColumn 

$Temp = Join-Collections $Temp $JoinColumn $OSFileCSV $JoinColumn 

$Temp = Join-Collections $Temp $JoinColumn $NicFileCSV $JoinColumn | Export-Csv "VMJoined.csv" -NoTypeInformation -UseCulture 
+0

。 – manojlds

+0

どのようなエラーが出ますか?また、マージしているCSVデータの例を投稿してください。 –

+0

追加情報で更新... –

答えて

1

このコードは、PowerShellのv3の(使用しているもの@manojldsおそらくです)CTP 2で正常に動作します。 Powershell V2では、を2回目に呼び出すと、Join-Object関数のパラメータ$secondがバインドされません。これは簡単にJoin-Object関数内の処理ブロックに次の行を追加することによって確認することができる。

$psboundparameters | out-host 

初めてJoin-Collectionsを呼び出すときは、Join-Objectの両方のパラメータは(結合していることに気づくであろう、しかし二度目$second結合した。

をこの動作を引き起こしているものは不明であるが、それはPowerShellのV3で動作しているようだので、私はそれはバグだ推測している、もはやありません。

PowerShellのV2のいずれかで機能を動作させるために可能性明白なこのラインによって

$SecondCollection | Where{ $_."$SecondJoinColumn" -eq $first."$FirstJoinColumn" } | Join-Object $first 

:yがこの行を置き換えることにより、パラメータをバインド

$SecondCollection | Where{ $_."$SecondJoinColumn" -eq $first."$FirstJoinColumn" } | %{Join-Object -first $first -second $_} 
私のために立派に動作
+0

あなたはv3を使って私について正しいです:) – manojlds

+0

非常に感謝! –

関連する問題