2
votes

Imprimer la sortie sur la même ligne à partir de la fonction Powershell

J'ai une fonction qui renvoie certaines instances d'une base de données:

Instans/er: instance1, instance2, instance3

Elle filtre le nom de chaque instance et l'imprime comme telle:

Instans/er:

Name          
----          
instance1
instance2     
instance3


1 commentaires

Je suggérerais de jeter un œil à format-list


3 Réponses :


2
votes

Sans changer votre fonction actuelle, vous pouvez faire:

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

Ou vous pouvez modifier la fonction pour afficher de cette façon par défaut (en gardant à l'esprit que cela entraîne que votre fonction ne renvoie plus de collection de noms, mais à la place une seule chaîne qui pourrait être moins utile):

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

Les deux solutions utilisent simplement l'opérateur -Join pour rejoindre la collection de Nommez les chaînes avec une virgule et un espace.


0 commentaires

1
votes

Essayez ceci:

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 commentaires

1
votes

En plus de ce qui a déjà été dit, je suggère fortement d'améliorer votre fonction pour devenir un fonction avancée comme suit:

$servers | Get-SqlServerInstance | select PSComputerName, Name

Ensuite, vous pouvez faire ceci:

XXX

Si c'est trop long pour vous, enveloppez-le dans une petite fonction d'aide:

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 ', ')"
}

Mais, je suis très sûr que cela ferait sens pour afficher le nom de l'ordinateur aussi:

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

À mon humble avis, ce serait la meilleure pratique et la manière la plus "PowerShell-ish" de le faire. p>

  • Get-SqlServerInstance est un nom plus approprié décrivant ce que fait la fonction
  • La fonction retourne désormais des objets, pas des chaînes (la voie à suivre dans PowerShell!)
  • Il fonctionne maintenant avec le pipeline (toujours préféré pour les performances)
  • La Test-Connection ne fait pas vraiment partie du but de la fonction. Votre fonction devrait lancer si elle ne peut pas se connecter! Alors je l'ai déplacé en dehors de la fonction.


0 commentaires