使用Invoke-Command格式化输出

时间:2017-10-01 22:49:37

标签: powershell powershell-v4.0 powershell-remoting 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                

我一直试图通过回显invoke-command并对计算机名称进行操作来摆脱RunSpaceId,我只做PSComputerNames来测试它是否可行。

write $test % {$_.PSComputerName }

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

1 个答案:

答案 0 :(得分:1)

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

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

正如BACON在对该问题的评论中指出的那样,Invoke-Command隐式地将PSComputerNameRunSpaceId属性添加到脚本块返回的对象({ ... } {1}})在每台目标计算机上运行,​​默认情况下它们是否显示取决于返回的对象的类型。
对于[Microsoft.PowerShell.ExecutionPolicy]返回的Get-ExecutionPolicy个实例,默认情况下会显示 ,这意味着只有显示的属性才能显示您需要明确Format-*来电。

请注意,自动添加的Value属性是远程执行脚本块的工件,返回[enum]派生类型的实例,例如[Microsoft.PowerShell.ExecutionPolicy]返回的实例{ {1}}。

远程调用Get-ExecutionPolicy脚本块输出非基础.NET类型实例返回类型为Invoke-Command反序列化对象。
Deserialized.<original-type-name> - 派生实例会生成一个反序列化类型,其[enum]属性定义为Value成员,签名为ScriptProperty

一般提示:

    通常不需要
  • System.Object Value {get=$this.ToString();},因为未在变量中捕获或重定向到文件/ Write-Output的任何语句的输出是隐式发送到输出流。

  • 如果您需要编写跨平台兼容的代码,请避免使用$null之类的别名,因为它们在PowerShell Core的Unix平台上无法按预期工作,其中会有别名阴影本机实用程序尚未定义。