How can I redirect PowerShell output when run from Task Scheduler?
Here is the command that worked for me. I didn't like the idea of redirecting the output in the script, since it would make it difficult to run manually.
powershell -windowstyle minimized -c "powershell -c .\myscript.ps1 -verbose >> \\server\myscript.log 2>&1"
I use the transcript feature to help with this. Just include it in your code and it outputs all (would be) screen content to a log file.
Start-Transcript -path $LogFile -append
<Body of the script>
Stop-Transcript
The following works for me on Windows 7:
powershell -command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log
In the Windows 7 Task Scheduler GUI:
program = "Powershell"
arguments = "-command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log"
Note that "-file" does not work because all parameters after the file name are interpreted as parameters to the file. Note that "2>&1" redirects the error output to the log file as well. Later versions of PowerShell do this in a slightly different way.
A combination of all the previous answers really helped me out...
My problem was that I needed to execute a PowerShell script over WinRM as part of a Packer provisioner, and it kept failing due to rights issues. The way around this is to execute as a scheduled task, but I needed to pass arguments to the script and get the output as well to confirm everything passed.
This snippet worked well for me:
# Generate a unique ID for this execution
$guid = [guid]::NewGuid()
$logFile = "C:\Windows\Temp\$guid.log"
$argument = "-NoProfile -ExecutionPolicy unrestricted -Command ""& {""$ScriptPath"" $ScriptArgs} 2>&1 > $logFile"""
$a = New-ScheduledTaskAction -Execute "powershell.exe" -Argument $argument
Register-ScheduledTask -TaskName $TaskName -RunLevel Highest -User $username -Password $password -Action $a | Start-ScheduledTask
do {
Start-Sleep -Seconds 30
$task = Get-ScheduledTask -TaskName $TaskName
} while ($task.State -eq 4)
The full script can be found here:
https://gist.github.com/dev-rowbot/fa8b8dadf1b3731067a93065db3e1bba
I would do:
Create a function to call your script and redirect the output of this function like this:
.ps1:
function test{
# Your simple script commands
ls c:\temp -Filter *.JPG
ls z:\ # Non-existent directory
}
test *> c:\temp\log.txt
Here is the log file:
Répertoire : C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 07/06/2008 11:06 176275 HPIM1427.JPG
-a--- 07/06/2008 11:06 69091 HPIM1428.JPG
-a--- 07/06/2008 11:06 174661 HPIM1429.JPG
ls : Lecteur introuvable. Il n'existe aucun lecteur nommé « z ».
Au caractère C:\temp\test.ps1:14 : 1
+ ls z:\ #non existent dir
+ ~~~~~~
+ CategoryInfo : ObjectNotFound: (z:String) [Get-ChildItem], Driv
eNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetC
hildItemCommand
You can control what do you want to output with the new V3 redirection operators:
Do-Something 3> warning.txt # Writes warning output to warning.txt
Do-Something 4>> verbose.txt # Appends verbose.txt with the verbose output
Do-Something 5>&1 # Writes debug output to the output stream
Do-Something *> out.txt # Redirects all streams (output, error, warning, verbose, and debug) to out.txt