我有一个返回数据库实例的函数:
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
答案 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
是一个更恰当的名称,用于描述函数的作用Test-Connection
并不是功能目的的一部分。如果无法连接,您的函数应该抛出!所以我将其移至函数外部。