【问题标题】:Formatting Output with Invoke-Command使用 Invoke-Command 格式化输出
【发布时间】:2017-10-01 22:49:36
【问题描述】:

我正在尝试将我的输出格式化为如下所示

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 函数,但我不知道如何在这种情况下发挥我的优势。实现我想要的输出的最佳方法是什么?

【问题讨论】:

  • 您熟悉Select-Object cmdlet 及其功能吗?
  • 我和我之前确实尝试过,但是在 Invoke-Command 内部,由于某种原因,它没有显示任何 PSComputerName 或 Value 并且它是无序的但是我只是在调用命令之外尝试过它确实有效。 @BACON 谢谢!
  • PSComputerNameRunspaceId 属性是由 Invoke-Command 添加的,这就是为什么您只能在调用 Invoke-Command 之外访问它们(或删除它们)。

标签: powershell powershell-4.0 powershell-remoting invoke-command


【解决方案1】:
PS> Invoke-Command $computers { Get-ExecutionPolicy } |
      Format-Table PSComputerName, Value

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

正如BACON 在 cmets 中指出的那样,Invoke-CommandPSComputerNameRunSpaceId 属性隐式添加到每个目标计算机上运行的脚本块 ({ ... }) 返回的对象中,而它们是否默认显示取决于返回的对象的类型。
对于Get-ExecutionPolicy 返回的[Microsoft.PowerShell.ExecutionPolicy] 实例,它们默认显示,这意味着为了显示您只需要一个感兴趣的属性明确的Format-* 调用。

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

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


一般提示:

  • Write-Output 通常不需要,因为任何未在变量中捕获或重定向到文件/到$null 的语句的输出隐式发送到输出流。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多