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

在Powershell函数的同一行上打印输出,powershell,Powershell,我有一个函数,它返回数据库的一些实例: function Get-ServiceStatus ([string[]]$server) { foreach ($s in $computer) { if (Test-Connection $s -Count 2 -Quiet) { Get-WmiObject win32_Service -Computer $s | where {$_.DisplayNam

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

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

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

$InstanceList = (Get-ServiceStatus).Name -Join ', '
"Instans/er: $InstanceList"
或者,您可以修改函数,使其在默认情况下以这种方式输出(请记住,这将导致函数不再返回名称集合,而是返回可能不太有用的单个字符串):

这两种解决方案都只需使用
-Join
操作符以逗号和空格连接名称字符串集合。

尝试以下操作:

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

除了已经说过的,我强烈建议将您的职能改进为:

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中的方法!)
  • 它现在可以与管道一起工作(始终是性能方面的首选)
  • 测试连接
    实际上并不是函数用途的一部分。如果函数无法连接,则应抛出!所以我把它移到了函数之外

我建议看一下
格式列表
$servers | Get-SqlServerInstance | select PSComputerName, Name