Форматирование вывода с помощью 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, где псевдонимы, которые будут скрывать собственные утилиты, не определены.