powershell - 使用 Invoke-Command 格式化输出

标签 powershell powershell-4.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                

我一直试图通过回显调用命令并执行计算机名称的 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在每台目标计算机上运行的脚本 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/

相关文章:

c# - 带换行符的查询无法在 PowerShell 中执行

Powershell脚本将文件夹中所有文件的名称更改为文件夹名称

powershell - 如何在 PowerShell 中的 Invoke-Command 中使用 foreach 循环?

regex - 如何检查数组是否与PowerShell中的特定字符串部分匹配?

windows - WinRM 连接问题?

powershell - 使用 PowerShell 凭据而不提示输入密码

windows - 如何停止 powershell 形式将 bool 值的变量赋值转换为大写字母

powershell - 如何在Powershell中获得不同项目的编号计数

powershell - 如何将 InputObject 上的 NoteProperties 访问到远程处理 session

powershell - 如何跨 Azure Functions 共享 Powershell psm1