Dit bericht is voor het laatst bijgewerkt op 7 december 2020.

4 min lezen.

Zo nu en dan kom je een situatie tegen waarin je de console-uitvoer (of het transcript) van een consoletoepassing op de een of andere manier moet dumpen. Ik ga eigenlijk beweren dat het veel vaker gebeurt dan men zou denken – in mijn geval, elke keer als een klant een webjob of een functie vereist, die men normaal gesproken zou inzetten op Azure, die wordt uitgevoerd op de servers van de klant. Deze post beschrijft hoe dat moet.

Probleem

Inhoudsopgave

Er gaat iets kapot of de app crasht, en de fout wordt gelogd in het eventlog… Maar alleen de fout, niet het hele transcript. Je zou alles willen hebben, om erachter te komen wat er aan de hand is, maar het eventlog is niet de juiste manier.

Of je onderzoekt een fout die iemand anders is overkomen, maar je krijgt alleen screenshots van console- of eventlogfouten, terwijl je juist alle mogelijke informatie over het probleem zou willen krijgen.

Wat te doen?

Oplossing: redirection operator > to the rescue!

Het is gelukkig vrij eenvoudig. Er zijn meerdere manieren om de uitvoer te pijpen, te dumpen, om te leiden, te loggen, te spiegelen of gewoon op te slaan naar bijna elk denkbaar doelmedium, maar omdat ik er een hekel aan heb om er altijd naar te googelen (en ik het me ook niet uit mijn hoofd kan herinneren), documenteer ik hier mijn voorkeursmanier.

Het is niet nodig om uitvoer naar een bestand te pijpen – omdat de omleiding van nature doet wat je zou kunnen doen met een pijp en “Out-File -FilePath” of een vergelijkbaar commando.

Hoe uitvoer omleiden naar een bestand in Powershell?

U kunt de hele console-uitvoer (en dus het hele PowerShell-transcript voor uw executable) naar een tekstbestand leiden door iets als dit te doen:

executable.exe > output.txt 2>&1

OR

executable.exe *>&> output.txt

Deze methode schrijft gewoon alles van het consolevenster naar een bestand – zo eenvoudig is dat!

Hoe kunt u de console-uitvoer van uw aangepaste uitvoerbare programma omleiden naar een bestand's console output to a file
Hoe kunt u de console-uitvoer van uw aangepaste uitvoerbare programma omleiden naar een bestand

En natuurlijk, is het niet alleen beperkt tot Command Prompt (cmd.exe) – het werkt ook in Windows PowerShell:

Hoe de PowerShell-console-uitvoer van uw aangepaste uitvoerbare programma omleiden naar een bestand's PowerShell console output to a file
Hoe de uitvoer van de PowerShell-console van uw aangepaste uitvoerbare programma omleiden naar een bestand

Als u wilt controleren of dit werkt, kunt u het volgende in PowerShell uitvoeren – het voert eerst “Hallo wereld” uit en leidt het dan eenvoudig om naar de bestandsuitvoer.txt:

echo “Hello World” >output.txt 2>&1.\output.txt

Het tweede commando zou output.txt in een teksteditor moeten openen – en het zou “Hello World” moeten bevatten.

In deze voorbeelden hebben de volgende parameters invloed op het resultaat:

Element Description
Redirection operator: > Schrijft de opdrachtuitvoer naar een bestand of een apparaat, zoals een printer, in plaats van naar het venster Opdrachtprompt.
2>&1 Deze parameters zorgen ervoor dat deze opdracht eerst stdout (Standard Output Stream) omleidt naar het uitvoerbestand, en vervolgens stderr (Standard Error Stream) daar ook naar omleidt.
Voor een meer grondige lijst van verschillende beschikbare operatoren, zie hier.

Okay – dus nu is het eindelijk gedocumenteerd. Misschien hoef ik de volgende keer niet meer te googlen 🙂

Wacht… Maar hoe is dit beter dan copypasten vanuit een consolevenster?

Als je je applicatie niet zonder toezicht uitvoert, kun je gewoon de applicatie uitvoeren en vanuit het venster kopiëren en plakken naar de gewenste locatie. Dat is lekker makkelijk! Wat maakt deze methode dan beter?

Er schieten me een paar dingen te binnen:

Waarom console-uitvoer dumpen naar een bestand beter is dan gewoon copypasten

  1. Je kunt de transcripts zonder toezicht verkrijgen. U hoeft zelf niets te doen.
  2. Op deze manier kunt u het kopiëren niet verknoeien door delen van de uitvoer te selecteren.
    • Ik weet niet hoe het met u zit, maar ik verknoei vaak het kopiëren vanuit een console- of PowerShell-venster. Deze methode maakt dat onmogelijk.
  3. Dit is de gemakkelijkste manier die ik heb gevonden om andere mensen om de volledige uitvoer/het volledige transcript van een uitgevoerde consoletoepassing te vragen.
    • Dat is erg handig, want als ik aan het debuggen ben, wil ik echt het hele logboek en niet alleen de laatste paar regels rode tekst!

Verdere gedachten

Voor meer info en opties over de uitvoerscenario’s, zie deze Stack Overflow thread. Als je meer wilt lezen over stdout en stderr, kijk dan hier.

En voor verdere referentie, hier is een lijst met alle ondersteunde omleidingsoperatoren voor redelijk recente PowerShell-versies (waarschijnlijk geldig voor PowerShell >5.1):

2

Stuurt fouten en succesuitvoer naar de uitvoerstroom
succes

*

*>>

Redirection Wat doet het?
> Stuurt uitvoer naar het opgegeven bestand
>> Voegt uitvoer toe aan de inhoud van het
gespecificeerde bestand
2> Stuurt fouten naar het gespecificeerde bestand.
2>> Voegt fouten toe aan de inhoud van het
gespecificeerde bestand
2>&1
3> Stuurt waarschuwingen naar het opgegeven bestand
3>> Voegt waarschuwingen toe aan de inhoud van het
gespecificeerde bestand.
3>&1 Stuurt waarschuwingen en succesuitvoer naar de
succesuitvoerstroom
4> Stuurt verbose-uitvoer naar het opgegeven bestand
4>> Voegt verbose-uitvoer toe aan de inhoud van
het opgegeven bestand
4>&1 Stuurt verbose-uitvoer en succesuitvoer naar
de succesuitvoerstroom
5> Stuurt debugberichten naar het opgegeven bestand
5>> Voegt debug-berichten toe aan de inhoud van
het opgegeven bestand
5>&1 Stuurt debug-berichten en succes-uitvoer naar
de succes-uitvoerstroom
6> Stuurt informatieve berichten naar een opgegeven
bestand
6>> Voegt informatieve berichten toe aan de
inhoud van een opgegeven bestand
6>&1 Stuurt informatieve berichten en succes
output naar de succesuitvoerstroom.
*> Stuurt alle soorten uitvoer naar het opgegeven bestand
Voegt alle uitvoertypen toe aan de inhoud van
het opgegeven bestand
*>&1 stuurt alle uitvoertypen naar de succesuitvoer
stroom
Bron (toegepast)

Hoewel, een veel geavanceerder scenario zou zijn om de output direct op te slaan in Application Insights of iets dergelijks. In veel gevallen zou dit hetzelfde zijn als op een vlieg schieten met een bazooka, maar voor grotere implementaties, waarom niet. Misschien de moeite waard voor een blog post later!

  • Auteur
  • Recent Posts
mm
Ontwikkelaar / Spreker / Consultant bij Koskila / Valo Solutions Ltd. / Norppandalotti Software Co / Alter – Experience Ideas Ltd.
Antti Koskela is een trotse digital native nomadic millennial full stack developer (is dat genoeg grappige buzzwords? Dat is zeker genoeg grappige buzzwords!), die werkt als Solutions Architect voor Valo Intranet, het product dat je verliefd laat worden op je intranet.
Hij is een ontwikkelaar sinds 2004 (beginnend met PHP en Java), en hij buigt en draait SharePoint in verschillende vormen sinds MOSS. Tegenwoordig werkt hij niet alleen aan SharePoint, maar ook aan .NET projecten, Azure, Office 365 en een heleboel andere dingen. Hij is ook Microsoft MVP voor Office Development.
Dit is zijn persoonlijke professionele (bijv. professionele, maar zeker persoonlijke) blog.

mm
=”https:>=”https:>
Laatste berichten door Antti K. Koskela (zie alle)
  • Gids: Hoe een virale AAD-huurder over te nemen en te doden? – 24 maart 2021
  • Hoe maak ik een lijst van alle assemblies die in een PowerShell-sessie zijn geladen? – 18 maart 2021
  • Of Course I Still #ValoLove You – 15 maart, 2021
52votes
Artikelwaardering

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *