通过Powershell函数在同一行上打印输出

时间:2019-01-22 10:16:05

标签: powershell

我有一个返回数据库实例的函数:

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 :(得分:2)

在不更改当前功能的情况下,您可以执行以下操作:

$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运算符将名称字符串集合用逗号和空格连接起来。

答案 1 :(得分:1)

尝试一下:

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)"

答案 2 :(得分:1)

除了已经说过的话,我强烈建议将您的功能提高为advanced function,如下所示:

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并不是功能目的的一部分。如果无法连接,您的函数应该抛出!所以我将其移至函数外部。