Вывести вывод на одной строке из функции Powershell - PullRequest
0 голосов
/ 22 января 2019

У меня есть функция, которая возвращает несколько экземпляров базы данных:

function Get-ServiceStatus ([string[]]$server)
{
    foreach ($s in $computer)
    {
        if (Test-Connection $s -Count 2 -Quiet)
        {
            Get-WmiObject win32_Service -Computer $s |
            where {$_.DisplayName -match "SQL Server"} | 
            select Name
        }
    }
}

"Instans/er: "
get-servicestatus

Отфильтровывает имя каждого экземпляра и печатает его так:

Instans/er:

Name          
----          
instance1
instance2     
instance3

Как мне отформатировать текст для печати:

Instans/er: instance1, instance2, instance3

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Попробуйте это:

function Get-ServiceStatus ([string[]]$server)
{
    $instances = foreach ($s in $computer)
                {
                    if (Test-Connection $s -Count 2 -Quiet)
                    {
                        Get-WmiObject win32_Service -Computer $s |
                        where {$_.DisplayName -match "SQL Server"} | 
                        select -ExpandProperty Name
                    }
                }
    foreach ($instance in $instances)
    {
        $formattedinstances = $instance + ", "
    }
    $formattedinstances = $formattedinstances.Substring(0,$formattedinstances.Length-2)
    return $formattedinstances
}
"Instans/er: $(Get-ServiceStatus)"
0 голосов
/ 22 января 2019

В дополнение к тому, что уже было сказано, я настоятельно рекомендую улучшить вашу функцию до расширенной функции следующим образом:

function Get-SqlServerInstance {
    param (
        [Parameter(
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [string]$Computer = "localhost" # (default)
    )
    process {
        Get-WmiObject win32_Service -Computer $Computer | where {
            $_.DisplayName -match "SQL Server"
        }
    }
}

Тогда вы можете сделать это:

$instances = $servers | where {
    Test-Connection $_ -Count 1 -Quiet
} | Get-SqlServerInstance  | select -Unique -ExpandProperty Name
"Instans/er: $($instances -join ', ')"

Если это слишком долго для вас, оберните это в маленькую вспомогательную функцию:

function Print_ServiceStatus ([string[]]$servers) {
    $instances = $servers | where {
        Test-Connection $_ -Count 1 -Quiet
    } | Get-SqlServerInstance  | select -Unique -ExpandProperty Name
    Write-Host "Instans/er: $($instances -join ', ')"
}

Но я уверен, что было бы целесообразно также вывести имя компьютера:

$servers | Get-SqlServerInstance | select PSComputerName, Name

ИМХО, это было бы наилучшей практикой и большинство "PowerShell-ish" способов сделать это.

Преимущества:

  • Get-SqlServerInstance - более подходящее имя, описывающее, что делает функция
  • Функция теперь возвращает объекты, а не строки (путь в PowerShell!)
  • Теперь работает с конвейером (всегда предпочтительнее для производительности)
  • Test-Connection на самом деле не является частью цели функции. Ваша функция должна выдать, если она не может подключиться! Поэтому я переместил его за пределы функции.
0 голосов
/ 22 января 2019

Без изменения текущей функции вы можете сделать:

$InstanceList = (Get-ServiceStatus).Name -Join ', '
"Instans/er: $InstanceList"

Или вы можете изменить функцию для вывода таким образом по умолчанию (учитывая, что это приводит к тому, что ваша функция больше не возвращает коллекцию имен, а вместо этого одну строку, которая может быть менее полезной):

function Get-ServiceStatus ([string[]]$server)
{
    $InstanceList = foreach ($s in $computer)
    {
        if (Test-Connection $s -Count 2 -Quiet)
        {
            Get-WmiObject win32_Service -Computer $s |
            where {$_.DisplayName -match "SQL Server"} | 
            select -ExpandProperty Name
        }
    }
    $InstanceList -Join ', '

}

"Instans/er: $(Get-ServiceStatus)"

Оба решения просто используют оператор -Join, чтобы объединить коллекцию строк имени с запятой и пробелом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...