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!

Come reindirizzare l'output della console del tuo eseguibile personalizzato a un file's console output to a file
Come reindirizzare l’output della console del tuo eseguibile personalizzato a un file

E naturalmente, non è solo limitato al Prompt dei comandi (cmd.exe) – funziona anche in Windows PowerShell:

Come reindirizzare l'output della console PowerShell del vostro eseguibile personalizzato a un file's PowerShell console output to a file
Come reindirizzare l’output della console PowerShell del tuo eseguibile personalizzato a un file

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).
Per una lista più completa dei diversi operatori disponibili, vedere qui.

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

  1. Puoi ottenere le trascrizioni senza supervisione. Non devi fare nulla da solo.
  2. 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.
  3. 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
Fonte (applicata)

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
mm
Sviluppatore / Speaker / Consulente presso Koskila / Valo Solutions Ltd. / Norppandalotti Software Co / Alter – Experience Ideas Ltd.
Antti Koskela è un orgoglioso sviluppatore millenario nativo digitale (sono abbastanza parole d’ordine divertenti? Sono decisamente abbastanza parole d’ordine divertenti!), che lavora come Solutions Architect per Valo Intranet, il prodotto che ti farà innamorare della tua intranet.
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).

mm
=”https:>=”https:>
Latest posts by Antti K. Koskela (vedi tutti)
  • 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

52votes
Valutazione articolo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *