我正在尝试将我的输出格式化为如下所示
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
隐式添加 PSComputerName
和RunSpaceId
在每台目标计算机上运行的脚本 block ( { ... }
) 返回的对象的属性,默认情况下是否显示它们取决于返回对象的类型。
以[Microsoft.PowerShell.ExecutionPolicy]
为例Get-ExecutionPolicy
返回的实例,它们默认显示,这意味着为了仅显示感兴趣的属性,您需要显式 Format-*
打电话。
请注意,自动添加了 Value
属性是远程执行脚本 block 的工件,返回 [enum]
的实例-派生类型,例如 [Microsoft.PowerShell.ExecutionPolicy]
的实例返回者 Get-ExecutionPolicy
.
远程调用Invoke-Command
输出非原始 .NET 类型实例的脚本 block 返回 Deserialized.<original-type-name>
类型的反序列化对象.
[enum]
派生实例会产生带有 Value
的反序列化类型。属性定义为 ScriptProperty
签名成员(member)System.Object Value {get=$this.ToString();}
;有关序列化和反序列化如何在 PowerShell 远程处理和后台作业中工作的一般信息,请参阅 this answer .
一般提示:
Write-Output
通常不需要,因为任何未在变量中捕获或重定向到文件/到$null
的语句的输出隐式发送到输出流。如果您需要编写跨平台兼容的代码,请避免使用诸如
write
之类的别名。 ,因为它们无法在 PowerShell Core 中的类 Unix 平台上按预期工作,其中未定义会影响 native 实用程序的别名。
关于powershell - 使用 Invoke-Command 格式化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517619/