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.