我访问时遇到困难PSObject
定义了 NoteProperties,这些属性通过以下方式传递到远程会话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
}
对于上面的每行编号,我得到以下输出。
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...
请注意,最后两行清楚地表明 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 的空对象一致。
Help!
所以,我现在完全不知所措:这个薛定谔性质既存在又不存在;既有预期价值,也没有价值。我想我可以用稍微不同的方式来编写它,从而消除对 NoteProperties 的需要,但我很想知道这里发生了什么!