Comment produire quelque chose en PowerShell

j'exécute un script PowerShell à partir d'un fichier batch. Le script récupère une page web et vérifie si le contenu de la page est la chaîne "OK".

le script PowerShell renvoie un niveau d'erreur au script batch.

le script de lot est exécuté par ScriptFTP , un programme D'automatisation FTP. Si une erreur se produit, je peux demander à ScriptFTP d'envoyer la sortie complète de la console à l'administrateur par E-Mail.

dans le script PowerShell, je voudrais afficher la valeur de retour du site web si elle n'est pas" OK", de sorte que le message d'erreur est inclus dans la sortie de la console, et donc dans le message d'état.

Je suis nouveau à PowerShell et ne sais pas quelle fonction de sortie à utiliser pour cela. J'en vois trois:

  • Write-Host
  • Write-Output
  • Write-Error

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

167
demandé sur Pekka 웃 2010-01-10 22:08:08

7 réponses

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

"Hello, World!"

il crée un objet string, attribue la valeur susmentionnée, et étant le dernier élément sur le pipeline de commande il appelle la méthode .toString() et affiche le résultat à STDOUT (par défaut). Une chose de la beauté.

l'autre Write-* les commandes sont spécifiques à la sortie du texte à leurs flux associés, et ont leur place comme telle.

161
répondu Goyuix 2014-12-29 11:35:50

je pense que dans ce cas vous aurez besoin de Write-Output .

si vous avez un script comme

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

ensuite, si vous appelez le script avec la sortie redirigée, quelque chose comme yourscript.ps1 > out.txt , vous obtiendrez test2 à l'écran test1\ntest3\n dans le" out.txt".

notez que "test3" et la ligne Write-Output ajouteront toujours une nouvelle ligne à votre texte et il n'y a aucun moyen dans PowerShell de arrêter ce (qui est, echo -n est impossible en PowerShell avec le natif de commandes). Si vous voulez (le quelque peu basique et facile dans Bash ) la fonctionnalité de echo -n alors voir la réponse de samthebest .

si un fichier batch exécute une commande PowerShell, il capturera 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 devrait être écrit sur la console. pas. Nous avons maintenant convenu que la seule information si le script exécuté avec succès ou est mort doit être Write-Host 'ed, et tout ce qui est l'auteur du script pourrait avoir besoin de 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 du système, il peut facilement runthescript.ps1 >someredirectedoutput.txt et voir à l'écran, si tout va bien. Envoyer ensuite le " someredirectedoutput.txt" retour aux développeurs.

106
répondu naivists 2017-05-23 11:54:50

vous pouvez utiliser n'importe lequel de ceux-ci dans votre scénario puisqu'ils écrivent aux flux par défaut (sortie et erreur). Si vous étiez en train de raccorder la sortie à un autre commandlet , vous voudriez utiliser "Write-Output , qui se terminera finalement en " Write-Host .

cet article décrit les différentes options de sortie: PowerShell O est pour la sortie

7
répondu GrayWizardx 2014-12-27 14:28:31

je pense que ce qui suit est une bonne exposition D'Echo vs. Write-Host . Remarquez comment test() retourne un tableau d'entiers, 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])"

sortie terminale de ce qui précède:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789
6
répondu user2426679 2017-06-04 12:14:46

vous ne pouvez tout simplement pas obtenir PowerShell pour omettre ces nouvelles pesantes. Il n'y a aucun script ou cmdlet qui fait cela.

bien sûr Write-Host est un non-sens absolu parce que vous ne pouvez pas rediriger/pipe à partir de lui! Il vous suffit d'écrire le vôtre:

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:\>
2
répondu samthebest 2012-10-06 14:32:29
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta

Magenta peut être un de la "du Système.ConsoleColor" énumérateur des valeurs - Noir, bleu fonce, vert foncé, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gris, Gris, Bleu, Vert, Cyan, Rouge, Magenta, Jaune, Blanc.

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

2
répondu jordan.peoples 2015-02-02 22:15:26

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 séparé, mais PowerShell est mal conçu.

-11
répondu PowerlessShellUser 2014-12-27 14:35:24