В дополнение к тому, что уже было сказано, я настоятельно рекомендую улучшить вашу функцию до расширенной функции следующим образом:
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
на самом деле не является частью цели функции. Ваша функция должна выдать, если она не может подключиться! Поэтому я переместил его за пределы функции.