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
?
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.
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.
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
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
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:\>
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.
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.