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!
En natuurlijk, is het niet alleen beperkt tot Command Prompt (cmd.exe) – het werkt ook in Windows PowerShell:
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. |
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
- Je kunt de transcripts zonder toezicht verkrijgen. U hoeft zelf niets te doen.
- 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.
- 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):
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 |
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
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.
- 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