web-dev-qa-db-fra.com

Comment afficher quelque chose dans PowerShell

J'exécute un script PowerShell à partir d'un fichier de commandes. 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 de traitement par lots.

Le script de lot est exécuté par ScriptFTP , un programme d'automatisation FTP. Si une erreur se produit, ScriptFTP peut envoyer la sortie de la console complète à l'administrateur par courrier électronique.

Dans le script PowerShell, je voudrais afficher la valeur de retour du site Web si ce n'est pas "OK". Le message d'erreur est donc inclus dans la sortie de la console, et donc dans le courrier de statut.

Je ne connais pas encore PowerShell et je ne suis pas sûr de la fonction de sortie à utiliser pour cela. Je peux en voir trois:

  • Write-Host
  • Écriture-sortie
  • Erreur d'écriture

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

192
Pekka 웃

Produire simplement quelque chose est PowerShell est une affaire de beauté - et l’une de ses plus grandes forces. Par exemple, le bonjour, World! l'application est réduite à une seule ligne:

"Hello, World!"

Il crée un objet chaîne, attribue la valeur susmentionnée. En tant que dernier élément du pipeline de commandes, il appelle la méthode .toString() et renvoie le résultat à STDOUT (par défaut). Une chose de beauté.

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

186
Goyuix

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 une sortie redirigée, quelque chose comme yourscript.ps1 > out.txt, vous obtiendrez test2 à l'écran test1\ntest3\n dans le fichier "out.txt".

Notez que "test3" et la ligne Write-Output ajoutent toujours une nouvelle ligne à votre texte et qu'il est impossible dans PowerShell de l'arrêter (c'est-à-dire que echo -n est impossible dans PowerShell avec les commandes natives). Si vous voulez (la fonctionnalité un peu basique et simple de Bash ) de echo -n, voyez réponse de samthebest .

Si un fichier de commandes exécute une commande PowerShell, il capturera 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 sommes maintenant convenus que si le script est exécuté avec succès ou s'il doit être exécuté doit être Write-Host 'ed, et tout ce que l'auteur du script peut avoir besoin de connaître sur l'exécution (quels éléments ont été mis à jour, quels champs ont été définis , et cetera) va en écriture-sortie. Ainsi, lorsque vous envoyez un script à l'administrateur système, il peut facilement runthescript.ps1 >someredirectedoutput.txt et voir à l'écran si tout va bien. Envoyez ensuite le "someredirectedoutput.txt" aux développeurs.

117
naivists

Je pense que ce qui suit est une bonne exposition de Echo vs. Write-Host . Notez que test () renvoie en réalité un tableau d'ints, et non un seul int, comme on pourrait facilement le laisser 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 du terminal de ce qui précède:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789
8
user2426679

Vous pouvez utiliser n'importe lequel de ces éléments dans votre scénario car ils écrivent dans les flux par défaut (sortie et erreur). Si vous dirigiez la sortie vers un autre commandlet, vous voudriez utiliser Write-Output , qui se terminera éventuellement par Write-Host .

Cet article décrit les différentes options de sortie: PowerShell O est destiné à la sortie

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

Le magenta peut être l’une des valeurs de l’énumérateur "System.ConsoleColor" - Noir, Bleu foncé, Vert foncé, NoirCyan, NoirRouge, DarkMagenta, NoirColoré, Gris, Gris foncé, Bleu, Vert, Cyan, Rouge, Magenta, Jaune, Blanc.

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

2
jordan

Vous ne pouvez tout simplement pas faire en sorte que PowerShell supprime ces nouvelles lignes embêtantes. Il n'y a pas de script ou d'applet de commande qui fait cela.

Bien sûr, Write-Host est un non-sens absolu parce que vous ne pouvez pas le rediriger! Vous devez simplement écrire le vôtre:

using System;

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

Par exemple.

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