Форматирование вывода с помощью 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                

Я пытался избавиться от RunSpaceId, повторив команду invoke и выполняя foreach из имен компьютеров, я только сделал PSComputerNames, чтобы проверить, будет ли он работать.

write $test % {$_.PSComputerName }

Я знаю, что в Invoke-Command встроена функция foreach, но я не знаю, как использовать это в своих интересах. Каков наилучший способ достичь желаемого результата?

1 ответ

Решение
PS> Invoke-Command $computers { Get-ExecutionPolicy } | Format-Table PSComputerName, Value

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

Как отмечает BACON в комментариях по этому вопросу, это Invoke-Command что неявно добавляет PSComputerName а также RunSpaceId свойства к объектам, возвращаемым блоком скрипта ({ ... }) запускаются на каждом целевом компьютере, и будут ли они отображаться по умолчанию, зависит от типа возвращаемого объекта.
В случае с [Microsoft.PowerShell.ExecutionPolicy] экземпляры возвращены Get-ExecutionPolicy они отображаются по умолчанию, а это означает, что для отображения только интересующих вас свойств вам необходимо явное Format-* вызов.

Обратите внимание, что автоматически добавляется Value свойство является артефактом удаленно выполняемого блока скрипта, возвращающего экземпляр [enum] -приобретенный тип, такой как экземпляры [Microsoft.PowerShell.ExecutionPolicy] вернулся Get-ExecutionPolicy,

Удаленно вызывается Invoke-Command блоки сценария, выводящие экземпляры не базового типа.NET, возвращают десериализованные объекты типа Deserialized.<original-type-name>,
[enum] производные экземпляры приводят к десериализованному типу с Value свойство определяется как ScriptProperty член с подписью System.Object Value {get=$this.ToString();},


Общие советы:

  • Write-Output как правило, не требуется, поскольку вывод любого оператора, который не записан в переменной или перенаправлен в файл / $null неявно отправляется в выходной поток.

  • Если вам когда-либо понадобится написать кросс-платформенный код, избегайте таких псевдонимов, как write потому что они не будут работать должным образом на платформах Unix в PowerShell Core, где псевдонимы, которые будут скрывать собственные утилиты, не определены.

Другие вопросы по тегам