PowerShell script won't execute as a Windows scheduled task
If the problem you're having is with Execution Policy, then you can also set the execution policy of a specific invocation of PowerShell. This is what I usually do when executing PowerShell through a scheduled task:
powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1
Why?
-NoProfile
This ensures that you don't rely on anything in the user's PowerShell profile, and avoids the overhead of executing that additional code.
-NoLogo
This mostly doesn't matter; maybe it does if you're capturing the output of your script. Mostly it makes me feel better.
-NonInteractive
Ensures that your task won't wait indefinitely if something in your script unexpectedly prompts the user. With this switch, the script will just exit instead; at least you'll have an error code instead of a hanging script.
-ExecutionPolicy Bypass
You can use Unrestricted
here or whichever execution policy you like. This is probably the one you need the most.
Why I prefer setting Execution Policy this way:
Because I don't want the task to depend on a global non-default setting that you may have other reasons to change in the future. If some other process depends on a different execution policy, then it's not at odds with your task this way.
Plus it's always nice not to have to change the defaults. Less to remember/document/test.
Bonus
See JohnLBevan's answer for some additional causes of 0x1
result in a scheduled task.
There are several possible causes for a PowerShell script invoked by the task scheduler to complete with code 0x1
:
- The execution policy does not allow the script to run. See Briantist's excellent answer for detail on this.
- The task does not have the
Run with highest privileges
flag (checkbox on the task's General tab) enabled.* - Parameters are being passed to the script incorrectly. If using an approach such as
-File ".\MyScript.ps1" -Parameter1 'Demo'
, instead try:-Command "& .\MyScript.ps1 -Parameter1 'Demo'"
*As Ben points out in the comments, Run with highest privileges
doesn't have to be enabled / it depends if the script requires admin rights (e.g. if some commands like Set-ExecutionPolicy
or Stop-Process
may require these). If you're not sure, try ticking the option to see if it fixes your issue; if it doesn't seem to make a difference, leave it unchecked.
I've done this before and had similar issues. It's almost always the PowerShell security settings. Most obviously, I would double-check your execution policy (assuming that you've set it).
Which user does the task run as? Has that user run a PowerShell script before? If I remember right, each user is prompted to "allow" PowerShell scripts to run (Y/N), when running a script for the first time (regardless of execution policy). That has bitten me before. Try:
- logging-in as that user
- check the execution policy
- kick-off the script from a PowerShell prompt
- reply to any prompts that follow.
After the first run, you shouldn't have to worry about that again, and it should run from the task scheduler just fine.
Depending on your domain security, you might also have to set the group execution policy. Here's an article that details how to do that, as well as a couple other things to check: PowerShell Security.