L'exécution de la commande suivante dans l'invite de commande PowerShell fonctionne comme prévu:
$my_service_check = Get-Service "my_service" echo "My Service Status: $my_service_check" *output* my_service: System.ServiceProcess.ServiceController
Cependant, si vous créez un scritp ps1 comme suit, ma sortie n'est pas ce à quoi je m'attendais.
XXX
pourquoi le script ne renvoie-t-il pas la même sortie que la commande?
3 Réponses :
En voici une simple:
echo "My Service Status:" $my_service_check
auparavant, j'ai fait écho au texte et à ma variable entre guillemets. pouvez-vous me dire pourquoi cela fonctionne en dehors des citations comme vous le suggérez mais pas à l'intérieur?
echo "mon service: $ myservice" - il dit "object.Tostring (), et ici echo" mon service: "$ myservice on affiche un objet
L'utilisation du script ci-dessous semble afficher les résultats comme vous le souhaitez:
$myService = Get-Service #SERVICE_NAME Write-Host "My service: " $myService Pause
Sortie:
Mon service: SERVICE_NAME
Appuyez sur Entrée pour cotinuer ...:
Il s'agit davantage de l'emplacement des guillemets dans l'instruction echo.
Dans votre exemple, $ my_service_check est un objet System.ServiceProcess.ServiceController - ce n'est pas une chaîne qui contient uniquement les données que vous voyez. Vous pouvez appeler des méthodes dessus, par exemple - $ my_service_check.Start ().
Maintenant, si vous aviez
echo "My Service Status: $my_service_check"
PowerShell est assez intelligent pour vous réaliser souhaitez afficher les données lisibles par l'homme dans cet objet - et vous obtenez de jolis résultats.
Parce que vous avez
echo "My Service Status:" $my_service_check
PowerShell affiche l'objet lui-même sous forme de chaîne - ce qui n'est presque jamais ce que vous voulez réellement.
Merci @Mark, c'est logique. Auparavant, j'ai créé une variable en utilisant get-content et select-string. Cet objet est-il une chaîne parce que je dis explicitement obtenir le contenu du fichier et choisir la chaîne qui correspond où, comme ici, je ne sélectionne pas explicitement une chaîne?
Sorte de. Select-String retournera en fait un objet Microsoft.PowerShell.Commands.MatchInfo, il se trouve que ce type d'objet particulier fonctionne mieux lorsque vous l'affichez. Je suppose que cela est dû au fait que cette classe a été conçue par l'équipe PowerShell, tandis que ServiceController provient de .NET Framework et a été conçu avec un langage comme C # ou VB.NET à l'esprit.
Quelle sortie attendez-vous? Ou cherchez-vous simplement une explication pourquoi cela se produit?
Dans mon script, je m'attendais à voir la sortie comme je le vois lorsque j'exécute la commande dans l'invite