Форматирование вывода с помощью 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, но я не знаю, как ее использовать в этой ситуации. Как лучше всего достичь желаемого результата?


person Katz    schedule 01.10.2017    source источник
comment
Знакомы ли вы с Select-Object командлетом и его возможностями? ?   -  person Lance U. Matthews    schedule 02.10.2017
comment
Я пробовал, и я пробовал это раньше, но внутри Invoke-Command, и по какой-то причине он не отображал ничего для PSComputerName или Value, и он был беспорядочным, однако я просто попробовал его вне команды invoke, и он действительно сработал. @BACON Спасибо!   -  person Katz    schedule 02.10.2017
comment
Свойства PSComputerName и RunspaceId добавляются Invoke-Command, поэтому вы можете получить к ним доступ (или отключить их) только вне вызова Invoke-Command.   -  person Lance U. Matthews    schedule 02.10.2017


Ответы (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();}; для получения общей информации о том, как сериализация и десериализация работают в удаленном взаимодействии PowerShell и фоновых заданиях, см. этот ответ.


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

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

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

person mklement0    schedule 02.10.2017