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:
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:
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'
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? –
Est-il absolument nécessaire que les propriétés Status et StartType soient incluses? – Persistent13
Actuellement, la fenêtre pop-up a le texte mais ne répertorie pas les services avec le statut et StartType @AnsgarWiechers – Mike