Questo post è stato aggiornato di recente il 7 dicembre 2020.
4 min read.
Ogni tanto, ci si imbatte in una situazione in cui si ha bisogno di scaricare in qualche modo l’output della console (o la trascrizione) dell’esecuzione di un’applicazione da console. In realtà sto per sostenere che accade molto più spesso di quanto si pensi – nel mio caso, ogni volta che un cliente richiede un webjob o una funzione, che normalmente si distribuisce su Azure, che viene eseguita sui server del cliente. Questo post descrive come farlo.
Problema
Tabella dei contenuti
Qualcosa si rompe o l’app va in crash, e l’errore viene registrato nel registro eventi… Ma solo l’errore, non l’intera trascrizione. Ti piacerebbe avere tutto, per capire cosa sta succedendo, ma il registro eventi non è la strada da percorrere.
Oppure, forse state indagando su un errore che è successo a qualcun altro, ma ottenete solo screenshot degli errori della console o del log degli eventi, mentre invece vorreste ottenere tutte le informazioni possibili sul problema.
Cosa fare?
Soluzione: operatore di reindirizzamento > in soccorso!
E’ fortunatamente abbastanza facile. Ci sono più modi per fare pipe, dump, redirect, log, mirror o semplicemente salvare l’output su quasi tutti i mezzi di destinazione immaginabili, ma dato che odio cercare sempre su Google (e per quanto mi riguarda, non riesco a ricordarmelo a memoria), sto documentando qui il mio modo preferito.
Non c’è bisogno di convogliare l’output su file – perché il reindirizzamento fa nativamente ciò che si potrebbe fare con una pipe e “Out-File -FilePath” o comandi simili.
Come reindirizzare l’output su file in Powershell?
È possibile indirizzare l’intero output della console (e quindi l’intera trascrizione PowerShell per il vostro eseguibile) a un file di testo facendo qualcosa del genere:
executable.exe > output.txt 2>&1
OR
executable.exe *>&> output.txt
Questo metodo scrive semplicemente tutto dalla finestra della console in un file – semplice!
E naturalmente, non è solo limitato al Prompt dei comandi (cmd.exe) – funziona anche in Windows PowerShell:
Se vuoi verificare che funzioni, puoi eseguire il seguente in PowerShell – prima emette “Hello World” e poi semplicemente lo reindirizza all’output del file.txt:
echo “Hello World” >output.txt 2>&1.\output.txt
Il secondo comando dovrebbe aprire output.txt in un editor di testo – e dovrebbe contenere “Hello World”.
In questi esempi, i seguenti parametri influenzano il risultato:
Elemento | Descrizione |
Operatore di ridirezionamento: > | Scrive l’output del comando in un file o in un dispositivo, come una stampante, invece che nella finestra del prompt dei comandi. |
2>&1 | Questi parametri fanno sì che questo comando reindirizzi prima lo stdout (Standard Output Stream) al file di output, e poi reindirizzi anche lo stderr (Standard Error Stream). |
Ok – così ora è finalmente documentato. Forse non dovrò cercare su Google la prossima volta 🙂
Aspetta… Ma in che modo questo è meglio del copia-incolla da una finestra di console?
Se non stai eseguendo la tua applicazione incustodita, potresti semplicemente eseguire l’applicazione e fare un copia-incolla dalla finestra nella tua posizione preferita. Questo è bello e facile! Quindi cosa rende questo metodo migliore?
Un paio di cose mi vengono in mente:
Perché scaricare l’output della console in un file è meglio del semplice copia-incolla
- Puoi ottenere le trascrizioni senza supervisione. Non devi fare nulla da solo.
- In questo modo, non incasinerai la copia selezionando da aree dell’output.
- Non so voi, ma io spesso incasino il copia-incolla da una console o da una finestra PowerShell. Questo metodo lo rende impossibile.
- Questo è il modo più semplice che ho trovato per chiedere ad altre persone l’intero output/trascrizione di un’applicazione da console.
- Questo è davvero utile, perché quando faccio il debug, voglio davvero l’intero log, e non solo le ultime righe di testo rosso!
Altri pensieri
Per maggiori informazioni e opzioni sugli scenari di output, vedi questo thread di Stack Overflow. Se vuoi saperne di più su stdout e stderr, guarda qui.
E per ulteriore riferimento, ecco un elenco di tutti gli operatori di reindirizzamento supportati per versioni di PowerShell ragionevolmente recenti (probabilmente valido per PowerShell >5.1):
Redirezione | Cosa fa? |
---|---|
> | Invia l’output al file specificato |
>> | Applica l’output al contenuto del file specificato |
2> | Invia gli errori al file specificato. |
2>> | Applica gli errori al contenuto del |
2>&1 | Invia gli errori e l’output di successo a il flusso di uscita di successo |
3> | Invia gli avvertimenti al file specificato |
3>> | Applica gli avvertimenti al contenuto del file specificato. |
3>&1 | Invia gli avvertimenti e l’output di successo al flusso di output di successo |
4> | Invia l’output verboso al file specificato |
4>> | Applica l’output verboso al contenuto di il file specificato |
4>&1 | Invia l’output verboso e successo a il flusso di uscita di successo |
5> | Invia messaggi di debug al file specificato |
5>> | Applica messaggi di debug al contenuto di il file specificato |
5>&1 | Invia i messaggi di debug e l’output di successo a il flusso di output di successo |
6> | Invia messaggi informativi ad un file specificato |
6>> | Applica messaggi informativi al contenuto di un specificato |
6>&1 | Invia i messaggi informativi e l’output di successo al flusso di output di successo. |
*> | Invia tutti i tipi di output al file specificato |
*>> | Applica tutti i tipi di output al contenuto di il file specificato |
*>&1 | Invia tutti i tipi di output all’output stream di successo |
Tuttavia, uno scenario molto più avanzato sarebbe quello di salvare l’output direttamente in Application Insights o qualcosa di simile. Per molti casi, questo sarebbe come sparare a una mosca con un bazooka, ma per distribuzioni più grandi, perché no. Forse vale la pena di scrivere un post sul blog più avanti!
- Autore
- Post recenti
Sviluppatore dal 2004 (iniziando con PHP e Java), ha piegato e trasformato SharePoint in diverse forme sin da MOSS. Oggi non lavora solo su SharePoint, ma anche su progetti .NET, Azure, Office 365 e molte altre cose. È anche Microsoft MVP per lo sviluppo di Office.
Questo è il suo blog personale (professionale, ma decisamente personale).
- Guida: Come prendere il controllo e uccidere un inquilino AAD virale? – 24 marzo 2021
- Come elencare tutti gli assembly caricati in una sessione PowerShell? – 18 marzo 2021
- Naturalmente io ancora #ValoLove You – 15 marzo, 2021