我很难通过定义的NoteProperties访问PSObject
,并通过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
}
我为上面的每个编号行获得以下输出。
$input
所以,首先我尝试了将变量转储到控制台的常用技术,确认属性是以预期值传递的:
NoteProperty1 : {some, value}
NoteProperty2 : {some, other, value}
PSComputerName : my-computer
RunspaceId : d1f35c8b-f631-4caa-bae0-f7c0066bbd55
PSShowComputerName : True
$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
的所有提及都开始激起我的兴趣......
$input.NoteProperty1
前两次运气好了,我开始尝试检查NoteProperty1
本身。但是,此属性的值似乎为null;使用上面的行没有任何内容写入控制台,$input.NoteProperty1 -eq $null
返回True。
$input.NoteProperty1 | Get-Member
所以,最后,我试图通过NoteProperty1
直接检查Get-Member
值,该值因为“没有为get-member cmdlet指定了对象”这条消息而失败了。与传递给Get-Member的null对象一致。
所以,我现在完全不知所措:这个薛定谔属性既存在又不存在;两者都有预期值,没有价值。我想我可以用稍微不同的方式来编写它,这将消除对NoteProperties的需求,但我很想知道这里发生了什么!
答案 0 :(得分: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]
}
}
对于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
}