2010-01-10 7 views
146

Je cours un script PowerShell à partir d'un fichier batch. Le script extrait une page Web et vérifie si le contenu de la page est la chaîne "OK".Comment générer quelque chose dans PowerShell

Le script PowerShell renvoie un niveau d'erreur au script de traitement par lots.

Le script de traitement par lots est exécuté par ScriptFTP, un programme d'automatisation FTP. Si une erreur se produit, je peux faire en sorte que ScriptFTP envoie la sortie complète de la console à l'administrateur par e-mail.

Dans le script PowerShell, je souhaite afficher la valeur renvoyée par le site Web s'il n'est pas "OK". Le message d'erreur est donc inclus dans la sortie de la console et donc dans le courrier d'état. Je ne connais pas encore PowerShell et je ne suis pas sûr de la fonction de sortie à utiliser pour cela. Je peux voir trois:

  • Write-Host
  • Write-Output
  • écriture Erreur

Quelle serait la bonne chose à utiliser pour écrire à l'équivalent de Windows de stdout?

Répondre

152

Simplement produire quelque chose est PowerShell est une chose de beauté - et l'un de ses plus grandes forces. Par exemple, le commun Bonjour, monde!l'application est réduite à une seule ligne:

"Hello, World!" 

Il crée un objet chaîne, affecte la valeur mentionnée ci-dessus, et étant le dernier élément de la canalisation de commande, il appelle la méthode .toString() et délivre en sortie le résultat à STDOUT (par défaut) . Une chose de beauté.

Les autres commandes Write-* sont spécifiques à la sortie du texte vers leurs flux associés et ont leur place en tant que telles.

+4

Ce n'est pas vraiment ce qui se passe. C'est une expression littérale de chaîne et la seule chose dans son pipeline. C'est donc équivalent à "Hello, World!" | Out-Host'. 'Out-Host' d'autre part envoie des objets à l'hôte PowerShell pour l'affichage et son implémentation dépend de l'hôte. L'hôte de la console les envoie à la poignée de sortie standard (passant par 'Out-Default' en cours de route), en effet. PowerShell ISE les affiche dans son volet de sortie, cependant, et d'autres hôtes peuvent faire d'autres choses entièrement. – Joey

+3

Les objets ne sont pas non plus convertis aveuglément en chaîne, mais passent par un _formatter_ qui décide quoi faire avec eux. C'est pourquoi vous voyez la sortie 'Get-ChildItem' qui se présente sous forme de tableau, par exemple, et les résultats avec de nombreuses propriétés (par exemple WMI) sont remplacés par' Format-List' à la place. – Joey

6

Vous pouvez utiliser l'une de ces options dans votre scénario, car elles écrivent dans les flux par défaut (sortie et erreur). Si vous transmettiez la sortie vers une autre commande, vous voudrez utiliser Write-Output, qui finira par se terminer par Write-Host.

Cet article décrit les différentes options de sortie: PowerShell O is for Output

+1

Merci pour le lien. Bonté, c'est * compliqué *. Si Write-host est une sorte de point de terminaison ou de fonction de vidage, j'essaierai d'y aller et de faire un rapport. –

91

Je pense que dans ce cas, vous aurez besoin Write-Output.

Si vous avez un script comme

Write-Output "test1"; 
Write-Host "test2"; 
"test3"; 

puis, si vous appelez le script avec une sortie redirigée, quelque chose comme yourscript.ps1 > out.txt, vous obtiendrez test2 sur l'écran test1\ntest3\n dans le « out.txt ». Notez que "test3" et la ligne Write-Output ajoutent toujours une nouvelle ligne à votre texte et PowerShell n'a aucun moyen d'arrêter cela (c'est-à-dire, echo -n est impossible dans PowerShell avec les commandes natives). Si vous voulez (la fonctionnalité un peu basique et facile dans Bash) de echo -n alors voir samthebest's answer.

Si un fichier batch exécute une commande PowerShell, il capture très probablement la commande Write-Output. J'ai eu "de longues discussions" avec les administrateurs système sur ce qui devrait être écrit sur la console et ce qui ne devrait pas l'être. Nous avons maintenant convenu que la seule information si le script exécuté avec succès ou mort doit être Write-Host 'ed, et tout ce que l'auteur du script doit savoir sur l'exécution (quels éléments ont été mis à jour, quels champs ont été définis, et cetera) va à l'écriture-sortie. De cette façon, lorsque vous soumettez un script à l'administrateur système, il peut facilement runthescript.ps1 >someredirectedoutput.txt et voir à l'écran, si tout est OK. Puis envoyez le "someredirectedoutput.txt" aux développeurs.

1

Vous ne pouvez simplement pas obtenir PowerShell pour ommit ces nouvelles lignes embêtantes. Il n'y a aucun script ou cmdlet qui fait cela.

Bien sûr, Write-Host est un non-sens absolu car vous ne pouvez pas rediriger/rediriger à partir de celui-ci! Vous devez simplement écrire les vôtres:

using System; 

namespace WriteToStdout 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args != null) 
      { 
       Console.Write(string.Join(" ", args)); 
      } 
     } 
    } 
} 

E.g.

PS C:\> writetostdout finally I can write to stdout like echo -n 
finally I can write to stdout like echo -nPS C:\> 
+0

Vous pourriez le faire dans PowerShell lui-même. [System.Console] :: Write ("stringy") Cependant, vous ne pourrez pas le rediriger du tout dans powershell. – Nicholi

+0

Bien sûr, vous pouvez. Voir [cette question] (http://stackoverflow.com/questions/3896258/how-to-output-text-without-newline-in-powershell) –

-10

Utilisez un programme externe comme à l'intérieur de votre script PowerShell:

cmd /c echo "Long string: $LongStr" 

C'est stupide et coûteux en termes d'exécution d'un processus distinct, mais PowerShell est mal conçu.

+11

Vous n'avez clairement aucune idée de ce dont vous parlez. Assez dit. – jebar8

+0

Je sais que je ne devrais pas mais lol –

2
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta 

Magenta peut être l'une des valeurs de recenseur "System.ConsoleColor" - Noir, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, darkyellow, Gris, DarkGray, Bleu, Vert, cyan, rouge, magenta, Jaune blanc.

Le + $File.FullName est facultatif et montre comment placer une variable dans la chaîne.

5

Je pense que ce qui suit est une bonne exposition de Echo par rapport à Write-Host. Remarquez que test() renvoie réellement un tableau d'ints, pas un seul int comme on pourrait facilement le croire.

function test { 
    Write-Host 123 
    echo 456 # AKA 'Write-Output' 
    return 789 
} 

$x = test 

Write-Host "x of type '$($x.GetType().name)' = $x" 

Write-Host "`$x[0] = $($x[0])" 
Write-Host "`$x[1] = $($x[1])" 

Borne de sortie de ce qui précède:

123 
x of type 'Object[]' = 456 789 
$x[0] = 456 
$x[1] = 789 
Questions connexes