Come reindirizzare l'output di una PowerShell su un file durante la sua esecuzione


198

Ho uno script di PowerShell per il quale vorrei reindirizzare l'output su un file. Il problema è che non posso cambiare il modo in cui viene chiamato questo script. Quindi non posso fare:

 .\MyScript.ps1 > output.txt

Come reindirizzare l'output di uno script PowerShell durante la sua esecuzione?

Risposte:


192

Forse Start-Transcriptavrebbe funzionato per te. Prima fermalo se è già in esecuzione, quindi avvialo e fermalo quando hai finito.

$ ErrorActionPreference = "SilentlyContinue"
Stop-Transcript | out-null
$ ErrorActionPreference = "Continua"
Start-Transcript -path C: \ output.txt -append
# Fai delle cose
Stop-Transcript

Puoi anche farlo funzionare mentre lavori su cose e salvarlo per le sessioni della riga di comando per riferimento futuro.

Se si desidera eliminare completamente l'errore quando si tenta di interrompere una trascrizione che non sta trascrivendo, è possibile effettuare questa operazione:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
Nota che start-transcript non registra solo output standard Write-Error, Write-Verbose o Write-Debug ...
Richard Berg,

6
@richard: sembra farlo adesso. Forse questa è un'aggiunta 2.0, non sono sicuro che queste risposte si applichino tutte alla 1.0.
Robert S Ciaccio,

Sto usando quasi lo stesso codice sopra. il mio problema è che Stop-Transcript | out-null invia comunque un output di errore se la trascrizione non viene avviata. Devo sopprimere il messaggio in quanto rovina il mio layout. -rotazione continua silenziosamente non aiuta neanche. qualche idea?
Mel

4
Alla fine, ho trovato i documenti per Start-Transcript . (frustrantemente non etichettato con il numero di versione di Powershell). Si dice "La trascrizione include tutti i comandi che l'utente e tutto l'output che appare sulla console". Tuttavia, ho testato Start-Transcript in Powershell 2.0 e ho scoperto che @Richard ha ragione, l'errore standard non è stato salvato nella trascrizione. Questo fa schifo!
Colonnello Panic,

Questo metodo non sembra avvisare se si dispone effettivamente dell'autorizzazione per scrivere nella posizione specificata.
demongolem,

51

Microsoft ha annunciato sul sito Web Powershell Connections (15/02/2012 alle 16:40) che nella versione 3.0 hanno esteso il reindirizzamento come soluzione a questo problema.

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

Vedere l'articolo della guida "about_Redirection" per dettagli ed esempi.

help about_Redirection

1
Non dicendo che mi piace questa soluzione. In effetti, lo trovo brutto, difficile da ricordare e inflessibile. Sembra che l'aggiunta di parametri di acquisizione del flusso ai cmdlet Out- *, Set-Content e Aggiungi-Content avrebbe funzionato in modo più Powershelly. Mentre ci sono, dovrebbero anche aggiungere un parametro -PassThru. Il che renderebbe effettivamente obsoleto il Cmdlet Tee-Object poco utile.
Nathan Hartley,

Sono confuso, come risponde alla domanda posta? "Come reindirizzare l'output di uno script PowerShell durante la sua esecuzione '?
Zoredache,

Hai ragione, @Zoredache, mi sembra di aver trascurato il requisito "impossibile cambiare il modo in cui questo script è chiamato". Quando si acquisisce la maggior parte dell'output, Start-Transcript è la strada da percorrere. Devo rimuovere questa risposta?
Nathan Hartley,

1
Per quelli che vengono qui per il reindirizzamento generale, Powershell ha aggiunto -OutVariable -WarningVariable -ErrorVariable, che risponde direttamente al mio commento del 3 gennaio 14.
Nathan Hartley,

2
No, va bene lasciarlo. Dato il numero di voti positivi è ovviamente utile. Questa domanda quasi sicuramente sta ottenendo hit da Google da persone che sono in grado di cambiare il modo in cui viene chiamato lo script.
Zoredache,

36

Uso:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
non risolve la domanda del PO perché non funziona "durante l'esecuzione". Ma l'ho dato +1 perché è utile sapere come convogliare Powershell comunque.
Paul Masri-Stone,

28

Presumo che tu possa modificare MyScript.ps1. Quindi prova a cambiarlo in questo modo:

$(
    Here is your current script
) *>&1 > output.txt

Ho appena provato questo con PowerShell 3. Puoi usare tutte le opzioni di reindirizzamento come nella risposta di Nathan Hartley .


Mi piace questa soluzione. È possibile utilizzare >> output.txt per aggiungere. Qualcuno sa se c'è un modo per fare in modo che questo crei ASCII invece di Unicode?
Prof. Von Lemongargle,

1
Potresti provare qualcosa del genere: *>&1 | Out-File $log -Encoding ascii -Append -Width 132ma Powershell è davvero brutto se devi controllare con precisione l'output.
mplwork,

Preferisco questo perché funziona all'interno della tua sceneggiatura. Perfetto per il vagabondo.
user3505901

25

Una possibile soluzione, se la tua situazione lo consente:

  1. Rinomina MyScript.ps1 in TheRealMyScript.ps1
  2. Crea un nuovo MyScript.ps1 che assomigli a:

    . \ TheRealMyScript.ps1> output.txt


18
powershell ".\MyScript.ps1" > test.log

1
Questa è stata l' unica delle molte opzioni che ha funzionato per il mio output di script.
cori,

17

Potresti dare un'occhiata al cmdlet Tee-Object . È possibile reindirizzare l'output a Tee, che verrà scritto nella pipeline e anche in un file


1
"output" | Set-Content -PassThru e "output" | Add-Content -PassThru funzionerà anche come Tee-Object, con l'ulteriore vantaggio di poter impostare la codifica.
Nathan Hartley,

16

Se desideri un reindirizzamento diretto di tutto l'output su un file, prova a utilizzare *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

Poiché si tratta di un reindirizzamento diretto al file, non verrà emesso sulla console (spesso utile). Se desideri l'output della console, combina tutto l'output con *&>1, quindi esegui il pipe con Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

Credo che queste tecniche siano supportate in PowerShell 3.0 o versioni successive; Sto testando su PowerShell 5.0.


4

Se vuoi farlo dalla riga di comando e non incorporato nello script stesso, usa:

.\myscript.ps1 | Out-File c:\output.csv

7
Il richiedente sta esplicitamente spiegando che la chiamata di script non può essere modificata.
Fer,

3
Non correlato alla domanda, ma utile per me, stavo cercando su Google di ottenere la giusta sintassi con Pipe to Out-File.
gReX,

0

Per incorporarlo nel tuo script, puoi farlo in questo modo:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

Questo dovrebbe fare il trucco.

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.