SAPIEN Technologies (Français)
Après de nombreuses années d’écriture de scripts pour la console Windows PowerShell, j’apprends maintenant le prochain niveau d’automatisation — écrire des applications GUI qui exécutent des commandes Windows PowerShell. Les formulaires PowerShell Studio fournissent une introduction douce et bien guidée aux applications GUI, mais il m’a encore fallu du temps pour briser les vieilles habitudes.
j’ai constamment besoin de me rappeler que les choses qui « fonctionnent” dans la console n’ont aucun sens dans une interface graphique. L’écriture de sortie est l’un d’entre eux.,
écriture de la sortie dans la Console
lorsque vous générez une sortie dans la console Windows PowerShell, la sortie apparaît sous forme de chaînes de texte dans la fenêtre de la console.
PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM
dans les coulisses, Windows PowerShell ajoute silencieusement une commande Out-String au pipeline et envoie les résultats à « sortie standard” (« stdout”). Le processus qui héberge Windows PowerShell gère la sortie standard, presque toujours en écrivant la sortie sur la console (le comportement de l’hôte peut varier).,
donc, si vous exécutez une applet de commande qui renvoie des objets, tels que L’applet de commande Get-Process, (représentations de chaîne de) les objets apparaissent dans la console.
Si vous formatez des objets, par exemple en utilisant Format-List ou Format-Table, (représentations de chaîne de) les objets formatés apparaissent dans la console.
Si vous exécutez Write-Host ou Write-Output, Out-Host ou Out-String, les chaînes de sortie apparaissent dans la console.
et même si vous envoyez la sortie à un autre flux de sortie en utilisant Write-Warning, Write-Verbose ou write-Error, par défaut, la sortie apparaît dans la console.,
Mais l’application GUI n’a pas de console. Qu’arrive-t-il à la sortie qui irait autrement à la console lorsqu’il n’y a pas de console? Et, plus important encore, comment gérer la sortie sans console?
Où est ma sortie?
Les applications GUI, comme celles que vous écrivez dans PowerShell Studio, n’ont pas de console. Il n’y a pas de sortie sur la sortie standard. Il n’y a pas de chaîne de sortie ajoutée automatiquement.
ainsi, lorsque vous générez une sortie et ne l’enregistrez pas dans un fichier ou une variable, la sortie est simplement perdue.,
Get-Process | ... <Nowhere> ...
c’est comme un lanceur qui lance une balle de baseball quand il n’y a pas de receveur sur le terrain. La balle tombe juste au sol et roule à un arrêt .. ignoré.
Donc, dans une application graphique, vous ne pouvez pas écrire de sortie et espérer pour le mieux. Si vous souhaitez afficher la sortie de l’applet de commande ou l’Enregistrer, vous devez le faire explicitement.
afficher la sortie dans une zone de texte
Une application graphique est une collection de contrôles. Pour afficher la sortie, vous devez affecter la sortie à un contrôle, tel qu’une zone de texte, une zone de texte riche ou une grille de données.,
par exemple, pour afficher le nom de l’ordinateur local dans la console, vous exécutez une commande en env:ComputerName.
PS C:> $env:ComputerNameJUNEB-TESTBOX
lorsque j’essaie la même chose dans une application graphique où il n’y a pas de console, Je ne vois aucun résultat du tout. Dans cet exemple, j’ai créé un formulaire avec un bouton qui, lorsqu’on clique dessus, exécute l’expression en env:ComputerName.,
$buttonComputerName_Click = { <b>$env:ComputerName</b>}
Mais, lorsque je clique sur le bouton, rien ne se passe, même si j’ai une fenêtre de console ouverte.
pour afficher le nom de l’ordinateur dans une application GUI, j’ajoute un contrôle d’affichage à mon formulaire et attribue la sortie de la commande à une méthode du contrôle d’affichage.,
par exemple, je peux ajouter un contrôle de zone de texte au formulaire et utiliser l’opérateur d’affectation (=) pour affecter le résultat de l’expression à la propriété Text de la zone de texte. Maintenant, lorsque vous cliquez sur le bouton, vous voyez la sortie dans la zone de texte.
$buttonComputerName_Click = {text textboxResults.Texte = $env:Nom_ordinateur}
Voici le résultat:
Afficher la Sortie dans un autre Programme
Vous pouvez également afficher la sortie des commandes dans les objets qui ne font pas partie de votre programme., Les professionnels de L’interface graphique pensent que cette approche est bâclée et non une meilleure pratique, mais vous pourriez La trouver utile pour tester ou déboguer.
Par exemple, vous pouvez rediriger la sortie vers le GridView applet de commande.
$buttonComputerName_Click = { $env:Nom_ordinateur | Out-GridView}
Voici le résultat:
Vous pouvez aussi écrire dans un fichier et ouvrez le fichier. Ces exemples de commandes créent un fichier temporaire, écrivent dans le fichier, puis utilisent le bloc-notes pour afficher le fichier., Encore une fois, cela fait grincer des dents les vrais programmeurs, mais cela fonctionne, au moins pour les tests.
Voici le résultat:
convertir en chaînes
Une autre tâche que vous devez gérer dans une application graphique est la conversion d’objets en chaînes de texte. Habituellement, cela signifie simplement canaliser votre sortie vers une applet de commande Out, telle que Out-String. Out cmdlets, y compris Out-GridView, convertissent les objets en données de chaîne.
lorsque vous écrivez une sortie sur la console, Windows PowerShell ajoute automatiquement une commande Out-String au pipeline., Mais, il n’y a pas de console et pas de chaîne de sortie automatique dans une application GUI.
lorsque vous affectez des objets non-string à un objet string ou à un contrôle qui prend des objets string, tels qu’une zone de texte, Windows PowerShell appelle la méthode toString() de l’objet. (Dans d’autres langues, le devoir échouerait, mais il essaie d’aider.) Avec certains objets, tels que les objets DateTime et ErrorRecord, toString() fonctionne très bien, mais, dans de nombreux cas, il produit des résultats étranges.
par exemple, cette commande affecte les résultats D’une commande Get-Process à une zone de texte., Windows PowerShell reconnaît que vous avez besoin de texte et appelle la méthode ToString() des objets de processus, mais le résultat n’est pas utile.
butt buttonGetProcess_Click = {text textboxResults.Text = Get-Process}
pour obtenir une représentation de chaîne de la table de processus par défaut, dirigez la sortie vers L’applet de commande Out-String, puis affectez-la à la zone de texte.
butt buttonGetProcess_Click = {text textboxResults.,Text = Get-Process/Out-String}
astuce: pour rendre la sortie facile à lire, définissez la zone de texte (ou la zone de texte riche) pour utiliser une police monospace. Dans PowerShell Studio, cliquez avec le bouton droit sur la zone de texte, cliquez sur Appliquer le jeu de Propriétés, puis cliquez sur Appliquer la police de la Console.
n’évitez pas complètement toString (). Il y a quelques objets où la méthode toString() produit un résultat utile. Les objets DateTime sont l’exemple classique. La méthode ToString () d’un objet DateTime renvoie une chaîne de format « short-date/long-time”. Hors-Chaîne de caractères retourne un « long-date/long-temps” format.,
PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM
#utilise toString () butt buttonGetDate_Click = {text textboxDate.Texte = Get-Date}
#Utilise toString()$buttonGetDate_Click = { $textboxDate.Texte = Get-Date Et | String}
Vous pouvez également utiliser le Format et UFormat paramètres de la cmdlet Get-Date pour obtenir une date formatée chaîne dans presque toutes les configurations., Par exemple, pour obtenir une date au format RFC1123, utilisez-Format R (ou « r”). Pas besoin de canaliser vers Out-String lorsque vous utilisez Format ou UFormat, car ces paramètres forcent l’applet de commande à renvoyer une chaîne.
PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT
conversion D’objets formatés
dans la console, les applets de commande de Format, telles que Format-Table, sont généralement le dernier élément d’un pipeline. La sortie a fière allure dans la console, car Windows PowerShell ajoute une commande Out-String au pipeline avant de l’Envoyer à la console.,
Mais, dans une application GUI, par défaut, vous obtenez le résultat de l’appel de la méthode toString() des objets de format renvoyés par les cmdlets de Format.
butt buttonGetHotfix_Click = {text textboxHotFix.Text = Get-HotFix / Format-Table-Property HotFixID, InstalledOn-AutoSize}
pour obtenir un affichage plus utilisable dans votre application GUI, dirigez les objets format vers L’applet de commande Out-String avant de les affecter à la propriété Text de la zone de texte.,
C’est mieux!
Après un certain temps, la tâche de gérer l’affichage de la sortie dans vos applications GUI devient aussi naturelle que de taper un nom d’applet de commande, mais pendant que vous apprenez, assurez-vous de tester et de vous assurer que toute votre sortie est capturée et affichée dans un format utilisable.
June Blender est une évangéliste de la technologie chez SAPIEN Technologies, Inc. Vous pouvez la joindre à [email protected] ou suivez-la sur Twitter à @juneb_get_help.