6

PSObjectを介してリモート セッションに渡されている NoteProperties が定義されている にアクセスするのが困難ですInvoke-Command。この目的のためにオブジェクトを作成する理由は、リモート セッションで 2 つの個別の情報にアクセスする必要があるためですが、PowerShell では単一のInputObject.

私のコードは次のようになります。

$sessionInput = new-object -TypeName System.Object
$sessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value @("some", "value")
$sessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty2 -Value @("some", "other", "value)
$session = New-PSSession -ComputerName my-computer -Credential (Get-Credential)
Invoke-Command -Session $session -InputObject $sessionInput {
    $input #1
    $input | Get-Member #2
    $input.NoteProperty1 #3
    $input.NoteProperty1 | Get-Member #4
}

上記の番号付きの行ごとに、次の出力が得られます。

1.$input

そのため、まず、変数をコンソールにダンプする通常の手法を試しました。これにより、プロパティが期待値で渡されることが確認されました。

NoteProperty1      : {some, value}
NoteProperty2      : {some, other, value}
PSComputerName     : my-computer
RunspaceId         : d1f35c8b-f631-4caa-bae0-f7c0066bbd55
PSShowComputerName : True

2.$input | Get-Member

これにより、以前の試行よりもわずかに多くの情報が生成されました。

   TypeName: Deserialized.System.Object

WARNING: column "PSComputerName" does not fit into the display and was removed.

Name          MemberType   Definition                                                                                       
----          ----------   ----------                                                                                       
Equals        Method       bool Equals(System.Object obj)                                                                   
GetHashCode   Method       int GetHashCode()                                                                                
GetType       Method       type GetType()                                                                                   
ToString      Method       string ToString(), string ToString(string format, System.IFormatProvider formatProvider)         
NoteProperty1 NoteProperty Deserialized.System.String[] NoteProperty1=some val...
NoteProperty2 NoteProperty Deserialized.System.String[] NoteProperty2=some oth...

最後の 2 行は、リモート セッションによって受信されたオブジェクトに NoteProperty が存在することを明確に示していることに注意してください。これらのすべての言及はDeserialized、私の興味をそそり始めています...

3.$input.NoteProperty1

最初の 2 つは運が良かったので、自分NoteProperty1自身を調べてみました。ただし、このプロパティの値は null のようです。上記の行を使用してコンソールに何も書き込まれない場合は、$input.NoteProperty1 -eq $nullTrue を返します。

4.$input.NoteProperty1 | Get-Member

そのため、最後に、 をNoteProperty1介して値を直接検査しようとしGet-Memberましたが、「get-member コマンドレットにオブジェクトが指定されていません。」というメッセージが表示されて惨めに失敗しました。これは、Get-Member に null オブジェクトが渡されたことと一致しています。

ヘルプ!

だから、私は今、完全に途方に暮れています. 両方に期待値があり、値がありません。NoteProperties の必要性を排除するために、これを少し異なる方法で書くことができると思いますが、ここで何が起こっているのか知りたいです!

4

1 に答える 1

8

勝利のためにオブジェクトを選択してください!:)

$SessionInput = New-Object -TypeName System.Object
$SessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value @("some", "value")
$SessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty2 -Value @("some", "other", "value")
$Session = New-PSSession -ComputerName 127.0.0.1
Invoke-Command -Session $Session -InputObject $SessionInput {
    [array]$NoteProperty1 = $Input | Select -Expand NoteProperty1
    for ($i = 0; $i -lt $NoteProperty1.Count; $i ++)
    {
        Write-Host -ForeGroundColor "Magenta" $i
        $NoteProperty1[$i]
    }
}

文字列変数の場合、次のように select ステートメントで文字列を展開する必要があります。

$SessionInput = New-Object -TypeName System.Object
$SessionInput | Add-Member -MemberType NoteProperty -Name NoteProperty1 -Value "SomeValue"
$Session = New-PSSession -ComputerName 127.0.0.1
Invoke-Command -Session $Session -InputObject $SessionInput {
    $NoteProperty1 = $Input | Select -Expand NoteProperty1
    $NoteProperty1
}
于 2012-03-19T21:57:41.663 に答える