2012-02-15 22 views

risposta

23

Write-host reindirizzare l'output solo alla console.

È possibile utilizzare write-output e reindirizzare a un file (> export.txt o tubo di out-file export.txt)

Nel caso estremo in cui è assolutamente necessario reindirizzare tutto l'output da uno script un'occhiata a questo cmdlet

start-transcript 
get-help start-transcript -full 
9

In PowerShell script > export.txt è zucchero sintattico per script | Out-File -path export.txt.

Write-Host invia gli oggetti all'host e non restituisce alcun oggetto. Ciò significa che nessun oggetto viene reindirizzato al cmdlet Out-File e non viene scritto nulla nel file export.txt. Una soluzione alternativa (nel caso in cui non si desideri modificare lo script) consiste nell'aprire una console cmd e reindirizzare l'output di PowerShell utilizzando il reindirizzamento della console cmd.

C:\> powershell .\script.ps1 > .\export.txt 
+0

Ho dimenticato di dire che esiste un comando di Exchange che è: Get-MailboxServer C: \> powershell. \ Script.ps1>. \ Export.txt Il termine 'Get-MailboxServer' non è riconosciuto come un cmdlet , funzione, programma operativo o file di script. Verifica il termine e riprova. Grazie – expirat001

+0

Provare a connettersi alla configurazione dello spazio di esecuzione remoto di Exchange all'inizio dello script. '$ session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http: // $ nomecomputer/powershell; import-pssession $ session'. Nel caso in cui abbiate problemi nel fare ciò, prendete in considerazione l'apertura di una nuova domanda in quanto questo problema non è correlato al problema iniziale. –

6

L'utilità di approcci diversi è in gran parte sta per essere basata sul vostro caso d'uso, naturalmente, ma ...

Il modo "giusto" per fare questo, credo, se si ha il controllo dei copioni (e questo è quello che faccio di solito, anche se ammetto che stavo cercando una scorciatoia oggi), è "sovraccarico" Write-Host, per così dire, e quindi inviare tutto ciò che avresti inviato a Write-Host a questo nuova funzione.

Solo per rimanere con i verbi PowerShell validi, chiamo il mio Write-Feedback.

function Write-Feedback() 
{ 
    param 
    (
     [Parameter(Position=0,ValueFromPipeline=$true)] 
     [string]$msg, 
     [string]$BackgroundColor = "Yellow", 
     [string]$ForegroundColor = "Black" 
    ) 

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg; 
} 

Così ora avete una funzione che opera essenzialmente identico a Write-Host, ma si può facilmente controllare dove l'uscita va. Se è necessario scrivere su un file, è possibile modificare Write-Feedback in modo che tutte le sue chiamate eseguano ora tutto ciò che è necessario.

Si potrebbe semplicemente cambiare la linea a Write-Output, a seconda se si sta facendo qualsiasi altra cosa giù la conduttura ...

... 
Write-Output $msg; 

Si potrebbe inviare l'output allo stesso file che si sta piping resto del comando, ma all'interno della funzione Write-Feedback, pur mantenendo il Write-Host troppo:

function Write-Feedback() 
{ 
    param 
    (
     [Parameter(Position=0,ValueFromPipeline=$true)] 
     [string]$msg, 
     [string]$BackgroundColor = "Yellow", 
     [string]$ForegroundColor = "Black" 
    ) 

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg; 
    $msg | Out-File "./export.txt" -Append; # <<< or add a param to location 
} 

O se avete un paio di valori anomali in cui non si desidera che il contenuto Write-Feedback per essere convogliato in un file, potresti aggiungere una nuova o parametro ptional che chiede cosa fare con ogni specifica chiamata Write-Feedback che si switch off - e inviare al file, a Write-Host, a Write-Output, ecc. - modificare il valore predefinito in quello che si desidera in genere e in modo esplicito switch parametro dove è impostato in modo esplicito.

ecc. Ecc.È davvero molto più facile instradare tutte le chiamate in una stanza di compensazione centralizzata per l'output in PowerShell. Quindi, quando fai fare cambia idea, non è una ricerca enorme e sostituisci e sostituisci un'attività.

Credo che l'unico dolore qui sarebbe se non si desidera inviare le cose lungo la pipeline, in modo Write-Output è fuori, ma ha voluto assicurarsi che il file Write-Feedback ha scritto al era lo stesso di quello che hai specificato nel il > export.txt dal tuo esempio senza modificare Write-Feedback ogni volta. Non sono sicuro se c'è un modo semplice per farlo.

Ma dal momento che dovresti essere già un passo rimosso dal tuo "passaggio pipe", probabilmente non è un caso d'uso legittimo.

In ogni caso, la linea di fondo è di sovraccaricare Write-Host e fare tutto ciò che si desidera modificando in un unico punto.