如何将InputObject上的NoteProperties访问到远程会话

ala*_*irs 5 powershell powershell-2.0 powershell-remoting

我在PSObject使用定义的NoteProperties 访问s时遇到了困难,这些会被传递到远程会话Invoke-Command.我为此目的构造一个对象的原因是我需要在远程会话中访问两个单独的信息,但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
}
Run Code Online (Sandbox Code Playgroud)

我为上面的每个编号行得到以下输出.

1. $input

所以,首先我尝试了将变量转储到控制台的常用技术,确认属性是以预期值传递的:

NoteProperty1      : {some, value}
NoteProperty2      : {some, other, value}
PSComputerName     : my-computer
RunspaceId         : d1f35c8b-f631-4caa-bae0-f7c0066bbd55
PSShowComputerName : True
Run Code Online (Sandbox Code Playgroud)

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...
Run Code Online (Sandbox Code Playgroud)

请注意,最后两行清楚地显示了远程会话接收的对象上存在NoteProperty.所有这些提及Deserialized都开始激起我的兴趣......

3. $input.NoteProperty1

我和前两个人有一些运气,我开始尝试检查NoteProperty1自己.但是,此属性的值似乎为null; 没有任何内容使用上面的行写入控制台,$input.NoteProperty1 -eq $null返回True.

4. $input.NoteProperty1 | Get-Member

所以,最后,我试图NoteProperty1直接通过检查值Get-Member,它失败了,消息"没有为get-member cmdlet指定任何对象.",这与传递给Get-Member的null对象一致.

救命!

所以,我现在完全不知所措:这个Schrödinger财产既存在又不存在; 两者都有预期值,没有价值.我想我可以用稍微不同的方式来编写它,这将消除对NoteProperties的需求,但我很想知道这里发生了什么!

Hun*_*pos 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]
    }
}
Run Code Online (Sandbox Code Playgroud)

对于String变量,您仍然需要在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
}
Run Code Online (Sandbox Code Playgroud)

  • 后续问题:为什么这种技术不适用于[string] NoteProperties?它以[string] :: Empty的形式返回. (2认同)