Why are my PowerShell scripts not running?

Powershell

Powershell Problem Overview


I wrote a simple batch file as a PowerShell script, and I am getting errors when they run.

It's in a scripts directory in my path. This is the error I get:

> Cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about-signing".

I looked in the help, but it's less than helpful.

Powershell Solutions


Solution 1 - Powershell

It could be PowerShell's default security level, which (IIRC) will only run signed scripts.

Try typing this:

set-executionpolicy remotesigned

That will tell PowerShell to allow local (that is, on a local drive) unsigned scripts to run.

Then try executing your script again.

Solution 2 - Powershell

You need to run Set-ExecutionPolicy:

Set-ExecutionPolicy Restricted <-- Will not allow any powershell scripts to run.  Only individual commands may be run.

Set-ExecutionPolicy AllSigned <-- Will allow signed powershell scripts to run.

Set-ExecutionPolicy RemoteSigned <-- Allows unsigned local script and signed remote powershell scripts to run.

Set-ExecutionPolicy Unrestricted <-- Will allow unsigned powershell scripts to run.  Warns before running downloaded scripts.

Set-ExecutionPolicy Bypass <-- Nothing is blocked and there are no warnings or prompts.

Solution 3 - Powershell

Use:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Always use the above command to enable to executing PowerShell in the current session.

Solution 4 - Powershell

I was able to bypass this error by invoking PowerShell like this:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

That is, I added the -executionpolicy bypass to the way I invoked the script.

This worked on Windows 7 Service Pack 1. I am new to PowerShell, so there could be caveats to doing that that I am not aware of.

[Edit 2017-06-26] I have continued to use this technique on other systems including Windows 10 and Windows 2012 R2 without issue.

Here is what I am using now. This keeps me from accidentally running the script by clicking on it. When I run it in the scheduler I add one argument: "scheduler" and that bypasses the prompt.

This also pauses the window at the end so I can see the output of PowerShell.

if NOT "%1" == "scheduler" (
   @echo looks like you started the script by clicking on it.
   @echo press space to continue or control C to exit.
   pause
)

C:
cd \Scripts

powershell -executionpolicy bypass -File .\rundps.ps1

set psexitcode=%errorlevel%

if NOT "%1" == "scheduler" (
   @echo Powershell finished.  Press space to exit.
   pause
)

exit /b %psexitcode%

Solution 5 - Powershell

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

The above command worked for me even when the following error happens:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.

Solution 6 - Powershell

Also it's worth knowing that you may need to include .\ in front of the script name. For example:

.\scriptname.ps1

Solution 7 - Powershell

The command set-executionpolicy unrestricted will allow any script you create to run as the logged in user. Just be sure to set the executionpolicy setting back to signed using the set-executionpolicy signed command prior to logging out.

Solution 8 - Powershell

We can bypass execution policy in a nice way (inside command prompt):

type file.ps1 | powershell -command -

Or inside powershell:

gc file.ps1|powershell -c -

Solution 9 - Powershell

On Windows 10: Click change security property of myfile.ps1 and change "allow access" by right click / properties on myfile.ps1

Solution 10 - Powershell

It would be ideal to bypass execution policies e.g. through

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Unfortunately this can still be prevented by group policies. As a workaround, you can encode your script as Base64 by running this in PowerShell:

[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes((Get-Content .\MYSCRIPT.ps1)))

Then execute the result like this:

powershell.exe -EncodedCommand "put-your-base64-string-here"

Caveat: This won't work with scripts that require parameters.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDevelopingChrisView Question on Stackoverflow
Solution 1 - PowershellMatt HamiltonView Answer on Stackoverflow
Solution 2 - PowershellNadeem_MKView Answer on Stackoverflow
Solution 3 - PowershellNaveenView Answer on Stackoverflow
Solution 4 - PowershellBe Kind To New UsersView Answer on Stackoverflow
Solution 5 - Powershelluser3335140View Answer on Stackoverflow
Solution 6 - PowershellLeon BambrickView Answer on Stackoverflow
Solution 7 - PowershellExchangeAdminView Answer on Stackoverflow
Solution 8 - PowershellWasifView Answer on Stackoverflow
Solution 9 - Powershelluser2781940View Answer on Stackoverflow
Solution 10 - PowershellChristian BrüggemannView Answer on Stackoverflow