2012-05-31 23 views
87

Ho una certa confusione sui vari modi di stampare (echo) sulla console. Ho visto che ci sono diversi modi per scrivere l'output alla console, come ad esempio:Il modo migliore per scrivere sulla console in PowerShell

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

Tutti e tre modi stamperanno alla console. Quello centrale è in qualche modo più semplice, meno prolisso e più facile da usare. Trovo anche che quando si scrive una funzione come ad esempio:

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

Esso restituisce ancora due stringhe in cantiere:

E io sono ancora in grado di stampare i valori:

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

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

In qualche modo trovo questo confuso. "Print something" si suppone sia uno pseudonimo a Write-Host o qual è l'intento?

+2

[Write-Host è il male ] (http://windowsitpro.com/blog/what-do-not-do-powershell-part-1) –

risposta

64

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

Basta lasciare che le cose cadono dal gasdotto è non un sostituto per Write-Host che esiste per la sola ragione di emettere testo nell'applicazione host.

Se si desidera stampare, utilizzare i cmdlet Write-*. Se si desidera restituire valori da una funzione, eseguire semplicemente il dump degli oggetti lì senza alcun cmdlet.

+0

Perché l'errore di lancio "Hello world" di Write-Host è "atteso fine dell'istruzione"? – FrenkyB

+0

Non ne ho idea. Digitando che in PowerShell qui mostra il comportamento previsto qui e non dà errori. – Joey

+1

Ho digitato quello nello script .vbs. Solo quella riga di codice e mi sta gettando un errore. – FrenkyB

35

Quello centrale scrive sul gasdotto. Write-Host e Out-Host scrive nella console. 'echo' è un alias per Write-Output che scrive anche sulla pipeline. Il modo migliore per scrivere sulla console sarebbe utilizzare il cmdlet Write-Host.

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

"hello world" | Do-Something 

ma questo non funzionerà in quanto Write-Host scrive alla console, non al gasdotto (Do-Qualcosa non sarà possibile ottenere 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 Write-Host molto, probabilmente stai sbagliando. – OldFart

+3

Beh, non è quello che l'OP ha chiesto, come scrivere sulla console? C'è una differenza tra scrivere all'host e scrivere alla pipeline, e uno deve sapere cosa fanno ciascuno. Aggiornerò la mia risposta con un chiarimento. –

Problemi correlati