Il modo migliore per scrivere sulla console in PowerShell


142

Sto avendo un po 'di confusione sui vari modi di stampare (eco) sulla console. Ho visto che ci sono diversi modi per scrivere l'output sulla console, come ad esempio:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

Tutti e tre i modi verranno stampati sulla console. Quello centrale è in qualche modo più semplice, meno dettagliato e più facile da usare. Trovo anche che quando scrivi una funzione come:

function GetValues()
{
    "1"
    "2"
}

Restituisce ancora due stringhe nella pipeline:

E sono ancora in grado di stampare i valori:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

La cosa che ho scoperto è che usare solo la stringa tra virgolette non appare sempre sugli host personalizzati e che ho dovuto usare Write-Host per ottenere valori da stampare sugli host personalizzati.

In qualche modo lo trovo confuso. È "Print something"dovrebbe essere un alias per Write-Hosto che cosa è l'intento?

Risposte:


101

Il comportamento predefinito di PowerShell è solo quello di scaricare tutto ciò che cade da una pipeline senza essere raccolto da un altro elemento della pipeline o essere assegnato a una variabile (o reindirizzato) in Out-Host. Ciò che Out-Hostfa è ovviamente dipendente dall'host.

Lasciare che le cose cadano fuori dalla pipeline non è un sostituto per il Write-Hostquale esiste per il solo motivo di emettere testo nell'applicazione host.

Se si desidera un output, utilizzare i Write-*cmdlet. Se si desidera restituire i valori da una funzione, quindi scaricare gli oggetti lì senza alcun cmdlet.


1
L'ho digitato nello script .vbs. Solo quella riga di codice e mi sta gettando un errore.
FrenkyB,

58

Quello centrale scrive sulla pipeline. Write-Hoste Out-Hostscrive sulla console. 'echo' è un alias per il Write-Outputquale scrive anche nella pipeline. Il modo migliore per scrivere sulla console sarebbe usare il Write-Hostcmdlet.

Quando un oggetto viene scritto nella pipeline, può essere utilizzato da altri comandi nella catena. Per esempio:

"hello world" | Do-Something

ma questo non funzionerà poiché Write-Hostscrive sulla console, non sulla pipeline (Do-Something non otterrà la stringa):

Write-Host "hello world" | Do-Something

3
Questa risposta è tecnicamente corretta, ma sospetto che porti fuori strada un utente neofita di PowerShell. La prima regola di PowerShell efficace è produrre output utile nella pipeline. Se stai usando molto Write-Host, probabilmente stai sbagliando.
OldFart

6
Bene, non è quello che l'OP ha chiesto, come scrivere sulla console? C'è una differenza tra scrivere sull'host e scrivere sulla pipeline, e si deve sapere cosa fanno ciascuno. Aggiornerò la mia risposta con un chiarimento.
Shay Levy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.