2017-02-08 21 views
0

私が間違っていることを理解できず、誰かが正しい方向に向けることを願っています。アレイから別のアレイにオブジェクトを1つ追加する

私はオブジェクトの配列を繰り返し処理しようとしていますが、何かが真実であれば、そのオブジェクトを1つのオブジェクトとして自分の配列に追加したいオブジェクトの元の配列)。私は新しい配列に情報を追加しているようですが、newarray [0]を実行して新しい配列を参照すると、オブジェクト全体ではなくオブジェクトの最初の項目が得られます。

問題は、この行と一緒に表示されます。

$global:MachinesInAD += $global:MachineObject 

csvファイル内のデータは、マシンのホスト名、マシンのIPアドレス、エラーコード、およびエージェントIDです。

MACHINENAME、10.10.10.10、ERROR101、123456FF

Function ReadExcelReport(){ 
$global:Report = "C:\TEMP\Tools\Scripts\agents.csv" 
$Unresponsive = import-csv $global:Report | Where-Object {($_.State -eq "QUEUED" -or $_.State -eq "FAILED")} #Add items to array from spreadsheet where the state is equal to queued or failed 
$global:UnresponsiveMachineInfo = @() 
foreach ($item in $Unresponsive){ 
     $global:UnresponsiveMachineInfo += ,@($item.'Hostname', $item.'IP Address',$item.'Error',$item.'Agent Cert ID') #Build the object - Add the following columns hostname, ip address, error, agent cert id 
} 
ADCheck 
} 

Function ADCheck(){ 
$Machine = $null 
$global:MachinesInAD = @() 
$global:MachinesNotInAD = @() 
$global:MachineObject = New-Object system.object 
$global:MachineObject = $Null 
$global:MachinesInAD = $null 

$global:UnresponsiveMachineInfo | foreach-object { #Iterate through each object in the array 

    $global:MachineObject = $_ 
    $Machine = $_[0] #Set Machine to the hostname AKA the first element in the array for the current ($_) object (objects defined above) 

    try{ 
     write-host "Checking A.D. for: $Machine" 
     if (Get-ADComputer $Machine){ #Check to see if the machine is in A.D. 
      write-host "Found $Machine in A.D." -ForegroundColor Green 
      $global:MachinesInAD += $global:MachineObject 
     } 
    } 
    catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] { #If the machine was NOT in A.D. catch the error it creates and... 
     write-warning -message "Machine $Machine not found in A.D." 
     $global:MachinesNotInAd += $MachineObject 
    } 
    } 
} 
+0

[mcve]にすることはできますか?一見したところから少なくとも3つの異なる場所に追加していますが、どこに問題があるのか​​は明確ではありません。 – briantist

+0

私はそれを行うでしょう、問題はこの行であるように見えます: "$ global:MachinesInAD + = global:MachineObject" – MrMr

+0

"$ Machine = $ _ [0]"を使ってテスト用のマシン名を取り出します。私は "$ global:MachineObject = $ _"で要素をキャプチャしようとします。真の場合、その要素を "$ global:MachinesInAD + = $ global:MachineObject"という新しい配列に追加します。技術的には、情報は追加されますが、個々の要素ではありません。例えば要素の各項目はそれ自身の要素です。ですから、 "$ global:MachineObject [0]"で完全な要素を参照しようとすると、ホスト名、IP、ErrorCode、およびエージェントIDではなく、ホスト名だけが取得されます。 – MrMr

答えて

1

オブジェクトを呼び出しているものので、これが起こっているが、単なる配列です(..オブジェクトですが、あなたの特性は、要素、ないプロパティです)。とにかく

、あなたがこれを行う:

$global:MachinesInAD += $global:MachineObject 

あなたは配列を連結してしまいます。

@(1,2,3) + @(4,5,6) 

この結果、3つの数字と配列ではなく6つの要素の配列になります。

アレイの代わりに[hashtable]または[PSObject]のいずれかを使用する必要があります。またはオリジナルのものを作成したときと同じように、次のような要素配列に強制的に配置する必要があります。

$global:MachinesInAD += ,@($global:MachineObject) 
+0

しかし、私はこのことを全く理解していないが、とても感謝している。私は今何を勉強すればいいのか分かり、あなたのソリューションはすごくうまくいった。ありがとうございました! – MrMr

関連する問題