直接登录到系统,我运行此语句,并得到以下输出:
(Get-ClusterNetwork 'cluster backups').role
None
这是完美的……甚至美丽,因为它的简单。
然而,当我使用 invoke-command 从远程计算机运行完全相同的语句时,到目前为止我一直认为就像在计算机的 CLI 中输入这个完全相同的语句一样,我得到了这个输出
Invoke-Command -Session $hi -ScriptBlock {(Get-ClusterNetwork 'cluster backups').role}
PSComputerName RunspaceId Value
-------------- ---------- -----
dumdum a84b6c89-dumdum-80d3-ed43230ee8ab None
现在这是真正有趣的事情。如果我将一个变量分配给调用命令输出,它将具有与上面显示的相同的输出,除非 - 我将其通过管道传递给设置剪贴板
所以变量
$hello = invoke-command -session $hi -scriptblock {(get-networkcluster 'cluster backups').role}
现在在提示符中输入 $hello ,我得到:
PSComputerName RunspaceId Value
-------------- ---------- -----
dumdum a84b6c89-dumdum-80d3-ed43230ee8ab None
这是预料之中的。但现在当我把它输送到设置剪贴板并粘贴 - 值为:
$hello | set-clipboard;
get-clipboard
None
这就是我想要的实际值。不知何故,到 set-clipboard 的管道知道只提取我最初要求的属性。即使是变量,也具有所有的属性。当我运行 $hello.gettype() - 我看到的值为Int32。如果 $hello 只返回我想要的值,这是有道理的,但它......不是。
但如果这还不够奇怪的话——我在调用命令中运行了一些函数,这只是其中一部分——所有函数都返回一个我试图报告的值。所以:
$row = '' | select computername, ClusterNetworkRole, IP;
$row.computername = $name;
$row.clusternetworkrole = $hello;
$row.ip = dum.dum.dum.dum;
Return $row;
你知道 $row.clusternetworkrole 的输出是什么吗?大胆猜测一下。
除了我想要的以外,这是所有财产。
$row
PSComputerName : dumdum
RunspaceId : b898bdad-dumdum-9eff-8a2beeefe78a
ClusterNetworkRole :
Computername : dum
IP : dum.dum.dum.dum
它不仅给了我我不想要的确切属性 - 它实际上将这些属性添加为 $row 的成员。
$row.RunspaceID
b898bdad-dumdum-9eff-8a2beeefe78a
现在我可以通过在语句末尾附加“.value”来获得我想要的值,所以这并不是一个需要解决的问题,而是一个关于 powershell 到底在做什么的问题。这句简单、美丽的小声明给我的生活带来了严重破坏。