Hoe iets in PowerShell uit te voeren

Ik voer een PowerShell-script uit vanuit een batchbestand. Het script haalt een webpagina op en controleert of de inhoud van de pagina de tekenreeks “OK” is.

Het PowerShell-script retourneert een foutniveau naar het batchscript.

Het batchscript wordt uitgevoerd door ScriptFTP, een FTP-automatiseringsprogramma. Als er een fout optreedt, kan ik ScriptFTP de volledige console-uitvoer per e-mail naar de beheerder laten sturen.

In het PowerShell-script wil ik de retourwaarde van de website uitvoeren als deze niet “OK” is, zodat de foutmelding wordt opgenomen in de console-uitvoer en dus in de statusmail.

Ik ben nieuw bij PowerShell en weet niet zeker welke uitvoerfunctie ik hiervoor moet gebruiken. Ik zie er drie:

  • Schrijfhost
  • Schrijfuitvoer
  • Schrijffout

Wat is het juiste om te gebruiken om naar het Windows-equivalent van STDOUTte schrijven?


Antwoord 1, autoriteit 100%

Gewoon iets uitvoeren is PowerShell is iets moois – en een van zijn grootste sterke punten. Bijvoorbeeld de gemeenschappelijke Hello, World! applicatie is teruggebracht tot een enkele regel:

"Hello, World!"

Het creëert een string-object, wijst de bovengenoemde waarde toe en als laatste item in de opdrachtpijplijn roept het de methode .toString()aan en voert het resultaat uit naar STDOUT(standaard). Een ding van schoonheid.

De andere Write-*-commando’s zijn specifiek voor het uitvoeren van de tekst naar de bijbehorende streams en hebben hun plaats als zodanig.


Antwoord 2, autoriteit 60%

Ik denk dat je in dit geval Write-Outputnodig hebt.

Als je een script hebt zoals

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

dan, als je het script aanroept met omgeleide uitvoer, zoiets als yourscript.ps1 > out.txt, je krijgt test2op het scherm test1\ntest3\nin de “out.txt”.

Merk op dat “test3” en de Write-Output-regel altijd een nieuwe regel aan uw tekst zullen toevoegen en er is geen manier in PowerShell om dit te stoppen (dat wil zeggen, echo -nis onmogelijk in PowerShell met de native opdrachten). Als je wilt (de ietwat eenvoudige en gemakkelijke in Bash) functionaliteit van echo -nbekijk dan samthebest’s antwoord.

Als een batchbestand een PowerShell-opdracht uitvoert, zal het hoogstwaarschijnlijk de Write-Output-opdracht vastleggen. Ik heb “lange discussies” gehad met systeembeheerders over wat er naar de console moet worden geschreven en wat niet. We zijn het er nu over eens dat de enige informatie als het script succesvol is uitgevoerd of is overleden, moet worden Write-Host‘ed, en alles wat de auteur van het script mogelijk moet weten over de uitvoering (welke items zijn bijgewerkt , welke velden zijn ingesteld, et cetera) gaat naar Write-Output. Op deze manier kan hij, wanneer u een script naar de systeembeheerder stuurt, gemakkelijk runthescript.ps1 >someredirectedoutput.txtuitvoeren en op het scherm zien of alles in orde is. Stuur dan de “someredirectedoutput.txt” terug naar de ontwikkelaars.


Antwoord 3, autoriteit 5%

Ik denk dat het volgende een goede tentoonstelling is van Echo vs. Schrijf-host. Merk op hoe test() in feite een array van ints retourneert, niet een enkele int zoals men gemakkelijk zou kunnen doen geloven.

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])"

Terminaaluitgang van het bovenstaande:

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

Antwoord 4, autoriteit 3%

U kunt elk van deze in uw scenario gebruiken, omdat ze naar de standaardstreams schrijven (uitvoer en fout). Als u de uitvoer naar een andere commandlet zou doorsturen, zou u Write-Output, die uiteindelijk eindigt in Write-Host.

Dit artikel beschrijft de verschillende uitvoeropties: PowerShell O is voor uitvoer


Antwoord 5, autoriteit 2%

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

Magenta kan een van de “System.ConsoleColor”-enumeratorwaarden zijn: zwart, donkerblauw, donkergroen, donkercyaan, donkerrood, donkermagenta, donkergeel, grijs, donkergrijs, blauw, groen, cyaan, rood, magenta, geel, wit.

De + $File.FullNameis optioneel en laat zien hoe je een variabele in de string plaatst.


Antwoord 6

Je kunt PowerShell gewoon niet zover krijgen dat die vervelende nieuwe regels worden weggelaten. Er is geen script of cmdlet die dit doet.

Natuurlijk is Write-Host absolute onzin omdat je er niet vanaf kunt omleiden/pipetten! Je hoeft alleen maar je eigen te schrijven:

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

Bijvoorbeeld

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

Other episodes