2017-08-21 2 views
0

J'ai un script qui va arrêter et démarrer les services. Cependant, j'ai eu quelques problèmes où les services ne s'arrêtent pas correctement, ce qui nécessite une intervention de l'utilisateur sur le serveur. Avant d'exécuter la partie des services de démarrage du script, j'utilise une instruction if pour vérifier si tous les services répertoriés sont arrêtés et s'ils ne l'ont pas fait, le script affiche une alerte.Liste des services et de l'état dans une fenêtre pop-up

Ci-dessous un extrait du script qui fait cela. J'essaye de lister les services dans le pop-up avec leur statut et type de démarrage mais pour une raison quelconque je ne reçois pas le retour de liste. En utilisant la ligne qui est actuellement commentée, j'obtiens les noms de service retournés mais c'est dans une chaîne.

#$RunningServices = (Get-Service -ComputerName $targetServer | Where-Object {($_.Name -like '*serviceAgroup*'-or $_.Name -like '*serviceBgroup*') -and $_.Status -eq "Running"}) 
$RunningServices = (Get-Service -ComputerName $targetServer | 
        Where-Object {($_.Name -like '*serviceAgroup*' -or $_.Name -like '*serviceBgroup*') -and $_.Status -eq "Running"}) | 
        select DisplayName, Status, StartType | 
        sort DisplayName; 
Format-Table; 
$pop = New-Object -ComObject WScript.Shell 
$pop.Popup("Log onto $targetserver and stop Running serviceAgroup and serviceBgroup.`r`n$RunningServices", 0, "Services have not stopped!", 1) 
+1

Il est pas clair pour moi ce que votre question est ici. Qu'est-ce qui ne fonctionne pas? Quel comportement attendez-vous? Quel comportement obtenez-vous réellement? –

+0

Est-il absolument nécessaire que les propriétés Status et StartType soient incluses? – Persistent13

+0

Actuellement, la fenêtre pop-up a le texte mais ne répertorie pas les services avec le statut et StartType @AnsgarWiechers – Mike

Répondre

1

Le pipeline dont la sortie que vous attribuez à la $RunningServices variables se termine à sort DisplayName. La sortie n'est pas passée dans Format-Table. Si vous mettez une variable avec un objet (ou un tableau d'objets) dans une chaîne, les objets sont étendus à leur représentation de chaîne respective.

Démonstration:

 
PS C:\>$s = Get-Service | Select-Object -First 3 
PS C:\>$s 

Status Name    DisplayName 
------ ----    ----------- 
Stopped AeLookupSvc  Application Experience 
Stopped ALG    Application Layer Gateway Service 
Stopped AppIDSvc   Application Identity 

PS C:\>"$s" 
AeLookupSvc ALG AppIDSvc 
PS C:\> _ 

Pour les services de la représentation de chaîne est la valeur de la propriété Name, comme vous pouvez le voir ci-dessus. Avec votre sélection de propriété (sans la propriété Name), le résultat doit être une chaîne vide à la place:

 
PS C:\>$s = Get-Service | Select-Object DisplayName,Status,StartType -First 3 
PS C:\>$s 

DisplayName        Status  StartType 
-----------        ------  --------- 
Application Experience     Stopped   Manual 
Application Layer Gateway Service  Stopped   Manual 
Application Identity     Stopped   Manual 

PS C:\>"$s" 

PS C:\> _ 

Pour obtenir la sortie de la table comme une chaîne, vous devez tuyau votre liste d'objets non seulement par Format-Table, mais aussi par Out-String. En effet, Format-Table ne génère pas de sortie de chaîne, mais une liste d'objets de format. Out-String les convertit en sortie de chaîne réelle.

 
PS C:\>$s1 = $s | Format-Table 
PS C:\>"$s1" 
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShe 
ll.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Interna 
l.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEnt 
ryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.P 
owerShell.Commands.Internal.Format.GroupEndData Microsoft.PowerShell.Commands.In 
ternal.Format.FormatEndData 
PS C:\>$s2 = $s | Format-Table | Out-String 
PS C:\>"$s2" 

DisplayName        Status  StartType 
-----------        ------  --------- 
Application Experience     Stopped   Manual 
Application Layer Gateway Service  Stopped   Manual 
Application Identity     Stopped   Manual 

Mais même avec cela votre sortie ne sera probablement pas ce que vous attendez. Contrairement aux boîtes de dialogue de l'interface graphique de la console PowerShell, elles utilisent une police proportionnelle, ce qui signifie que tous les caractères n'ont pas la même largeur. En raison de cela, quelque chose qui ressemble à une table appropriée lors de l'utilisation d'une police monospace sera très probablement déformé lorsque vous utilisez une police proportionnelle. Sortie la chaîne ci-dessus dans une boîte de dialogue de l'interface graphique comme ceci:

 
PS C:\>Add-Type -Assembly 'System.Windows.Forms' 
PS C:\>[Windows.Forms.Messagebox]::Show($s2) 

devrait vous présenter quelque chose comme ceci:

Service list (space-separated columns) in GUI dialog

Pour obtenir un résultat au moins un peu présentable, je vous suggère d'utiliser le format personnalisé cordes:

 
PS C:\>$s3 = $s | ForEach-Object {"{0}`t{1}`t{2}" -f $_.StartType,$_.Status,$_.DisplayName} | Out-String 
PS C:\>[Windows.Forms.Messagebox]::Show($s3) 

Cela devrait produire une sortie un peu plus présentable:

Service list (tab-separated columns) in GUI dialog

Les prises ci-dessus avantage du fait que les valeurs des propriétés StartType et Status ne varient pas trop en longueur, de sorte que les colonnes peuvent être alignées raisonnablement bien en séparant les valeurs des caractères de tabulation. Si vous devez avoir les noms de service sur le côté gauche, le formatage devient beaucoup plus compliqué, car vous devez insérer une quantité variable d'onglets en fonction du nombre et de la largeur des caractères dans les noms.Je vais laisser cela comme un exercice pour le lecteur.


Bottom line: Changer votre code à quelque chose comme ceci:

Add-Type -Assembly 'System.Windows.Forms' 

$svc = Get-Service -ComputerName $targetServer | Where-Object { 
    ($_.Name -like '*serviceAgroup*' -or $_.Name -like '*serviceBgroup*') -and 
    $_.Status -eq 'Running' 
} | Select-Object DisplayName,Status,StartType 

$str = $svc | Sort-Object DisplayName | ForEach-Object { 
    "{0}`t{1}`t{2}" -f $_.StartType,$_.Status,$_.DisplayName 
} | Out-String 

[Windows.Forms.Messagebox]::Show($str) 

et il devrait le faire (plus ou moins) ce que vous voulez.


Addendum: Une meilleure option pour afficher les propriétés d'une liste d'objets à l'utilisateur serait un gridview:

$svc = Get-Service -ComputerName $targetServer | Where-Object { 
    ($_.Name -like '*serviceAgroup*' -or $_.Name -like '*serviceBgroup*') -and 
    $_.Status -eq 'Running' 
} | Select-Object DisplayName,Status,StartType 

$svc | Out-GridView -Title 'Services' 
+0

C'est génial et c'est exactement ce dont j'avais besoin! Merci pour votre aide. – Mike

0
$($RunningServices.DisplayName -join "`r`n")