Как я могу отформатировать выходную строку в виде строки или полей объекта?

#powershell

#powershell

Вопрос:

Цель состоит в том, чтобы запустить скрипт, который проверит удаленное подключение PowerShell к списку хостов. Я бы хотел, чтобы статус каждого задания отображался в одной строке, а не хост и состояние в отдельных строках. Я хотел бы видеть:

server1 Завершен
server2 Завершен
server3 Сбой
server4 Завершен

Я попытался использовать {"$_.Location, $_.State"} в качестве последней строки, но, похоже, она выдает типы, а не значения.

Нужно ли мне создавать a New-Object , чтобы содержать эти два поля для вывода?

Да, использовать -AsJob для такого крошечного запроса излишне. Следующая цель — создать что-то, что будет запускать длительные задания.

Есть предложения по форматированию выходных данных? Или о чем-либо еще здесь, что не является PowerShell-ic.

 $server_list = @(
    'server1'
    ,'server2'
    ,'server3'
    ,'server4'
)

$outfile = ".get-psversions.csv"

$server_list |
    ForEach-Object {
        $thishost = $_

        Try {
            $current_host = $_
            $v = Invoke-Command -ComputerName $current_host {$PSVersionTable.PSVersion} -ErrorAction Stop -AsJob
        }
        Catch
        {
            $v = New-Object -TypeName "System.Version"
            $v | Add-Member -MemberType NoteProperty -Name PSComputerName -Value "$thishost connect failed"
        }
        $v
    }
Get-Job | Wait-Job | ForEach-Object {$_.Location, $_.State}
  
PS X:ScriptsPSAutomation > .получить-v2.ps1

Id Name PSJobTypeName State HasMoreData Location Команда
-- ---- ------------- ----- ----------- -------- -------
390 Job390 RemoteJob Запускает True server1 $ PSVersionTable.PSVersion
392 Job392 RemoteJob запускает True server2 $PSVersionTable.PSVersion
394 Job394 RemoteJob, выполняющий True server3 $ PSVersionTable.PSVersion
396 Job396 RemoteJob, выполняющий True server4 $ PSVersionTable.PSVersion
server1
Завершенный
server2
Завершенный
server3
Сбой
server4
Завершено

Ответ №1:

Для выбора свойств объектов используйте Select-Object :

 Get-Job | Wait-Job | Select-Object Location, State
  

Передайте результат в Format-Table , если вам нужно принудительно использовать табличный вывод (по умолчанию в табличной форме отображается до 4 свойств, если количество отображаемых свойств превышает это, PowerShell переключается в форму списка).

 Get-Job | Wait-Job | Select-Object Location, State | Format-Table -AutoSize
  

Конечно, вы также можете использовать оператор format, если вам нужны выходные строки с определенным форматом:

 Get-Job | Wait-Job | ForEach-Object { "{0}:`t{1}" -f $_.Location, $_.State }
  

Ответ №2:

Измените свой код на ForEach-Object, например:

 ForEach-Object {"$($_.Location) $($_.State)"}
  

Комментарии:

1. Большое спасибо, @Kory Gill. Это очень похоже command substitution на * nix оболочки.

2. @Liturgist В PowerShell это называется подвыражением , но по сути это одно и то же.