使用 Invoke-Command 格式化输出

Formatting Output with Invoke-Command

我正在尝试将我的输出格式化为这样

PSComputerName       Value
--------------       ------
Computer1           Restricted
Computer2           Unrestricted
Computer3           Unrestricted

这是我的代码,变量 $computers 指向一个文件的 Get-Content,该文件具有我将远程连接到的计算机名称

$test = Invoke-Command -ComputerName $computers -ScriptBlock {
$policy3 = Get-ExecutionPolicy 
Write-Output $policy3
}
write $test 

输出

PSComputerName             RunspaceId                 Value                     
--------------             ----------                 -----                     
Computer1                    7e4ebfbe-62d3-4035-9d5a... Restricted                
Computer2                    2ecd6932-1ed4-4f57-b9e9... Unrestricted              
Computer3                    73a119de-5d6d-4525-9958... Restricted                

我一直在尝试通过回显调用命令并执行计算机名称的 foreach 来摆脱 RunSpaceId,我只执行了 PSComputerNames 来测试它是否有效。

write $test % {$_.PSComputerName }

我知道 Invoke-Command 内置了一个 foreach 函数,但我不知道在这种情况下如何利用我的优势。实现我想要的输出的最佳方法是什么?

PS> Invoke-Command $computers { Get-ExecutionPolicy } |
      Format-Table PSComputerName, Value

PSComputerName  Value                     
--------------  -----                     
Computer1       Restricted                
...

正如 BACON 在对该问题的评论中指出的那样,Invoke-Command 隐式地将 PSComputerNameRunSpaceId 属性添加到对象 return在每个目标计算机上由脚本块 ({ ... }) 运行 编辑,默认情况下它们是否 显示 取决于对象的类型 returned.
对于 Get-ExecutionPolicy 编辑的 [Microsoft.PowerShell.ExecutionPolicy] 个实例 return,它们 默认显示 ,这意味着为了 显示 仅显示您需要显式Format-* 调用的感兴趣的属性。

请注意,自动添加的 Value 属性 是远程执行脚本块的产物 returning 一个 [enum] 派生类型的实例,例如[Microsoft.PowerShell.ExecutionPolicy] return 由 Get-ExecutionPolicy 编辑的实例。

远程调用 Invoke-Command 脚本块输出非原始 .NET 类型实例 return 反序列化 Deserialized.<original-type-name> 类型的对象。
[enum]-派生实例导致反序列化类型 Value 属性 定义为具有签名 System.Object Value {get=$this.ToString();}ScriptProperty 成员;有关序列化和反序列化如何在 PowerShell 远程处理和后台作业中工作的一般信息,请参阅


一般提示:

  • Write-Output一般是不需要的,因为任何没有捕获到变量或重定向到文件/到$null的语句的输出都是隐式发送到输出流。

  • 如果您需要编写跨平台兼容的代码,请避免使用 write 等别名,因为它们在 PowerShell Core 的类 Unix 平台上无法正常工作,其中未定义会影响本机实用程序的别名。