I have a PowerShell script for which I would like to redirect the output to a file. The problem is that I cannot change the way this script is called. So I cannot do:
.\MyScript.ps1 > output.txt
How do I redirect the output of a PowerShell script during its execution?
Start-Transcript would work for you. First stop it if it's already running, then start it, and stop it when done.
$ErrorActionPreference="SilentlyContinue" Stop-Transcript | out-null $ErrorActionPreference = "Continue" Start-Transcript -path C:\output.txt -append # do some stuff Stop-Transcript
You can also have this running while working on stuff and have it saving your command line sessions for later reference.
EDIT: If you want to completely suppress the error when attempting to stop a transcript that is not transcribing, you could do this:
$ErrorActionPreference="SilentlyContinue" Stop-Transcript | out-null $ErrorActionPreference = "Continue" # or "Stop"
Microsoft has announced on Powershell's Connections web site (2/15/2012 at 4:40 PM) that in version 3.0 they have extended the redirection as a solution to this problem.
In PS 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
See the "about_Redirection" help article for details and examples.
Write "Stuff to write" | Out-File Outputfile.txt -Append
One possible solution, if your situation allows it:
Create a new MyScript.ps1 that looks like:
.\TheRealMyScript.ps1 > output.txt
You might want to take a look at the cmdlet Tee-Object. You can pipe output to Tee and it will write to the pipeline and also to a file
I take it you can modify
MyScript.ps1. Then try to change it like so:
$( here is your current script ) *>&1 > output.txt
I just tried this with Powershell 3. You can use all the redirect options as in Nathan Hartley's answer.
.\myscript.ps1 | Out-File c:\output.csv
If you want to do it from the command line and not built into the script itself
To embed this in your script, you can do it like this:
Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append
That should do the trick.
If you want a straight redirect of all output to a file, try using
# 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 ;
Since this is a straight redirect to file, it won't output to console (often helpful). If you desire the console output, combined all output with
*&>1, and then pipe with
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 ;
I believe these techniques are supported Powershell 3.0+, I'm testing on Powershell 5.0.
powershell ".\MyScript.ps1" > test.log