我正在尝试将输出格式化为如此
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函数,但在这种情况下我不知道如何使用它。实现我想要的输出的最佳方法是什么?
答案 0 :(得分:1)
PS> Invoke-Command $computers { Get-ExecutionPolicy } | Format-Table PSComputerName, Value
PSComputerName Value
-------------- -----
Computer1 Restricted
...
正如BACON在对该问题的评论中指出的那样,Invoke-Command
隐式地将PSComputerName
和RunSpaceId
属性添加到脚本块返回的对象({ ... }
{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平台上无法按预期工作,其中会有别名阴影本机实用程序尚未定义。