¿Por qué no se ejecutan mis scripts de PowerShell?

103

Escribí un archivo por lotes simple como un script de PowerShell y recibo errores cuando se ejecutan.

Está en un directorio de scripts en mi ruta. Este es el error que obtengo:

No se puede cargar porque la ejecución de scripts está deshabilitada en este sistema. Consulte "Obtenga ayuda sobre la firma".

Busqué la ayuda, pero es menos que útil.

DesarrollandoChris
fuente

Respuestas:

102

Podría ser el nivel de seguridad predeterminado de PowerShell, que (IIRC) solo ejecutará scripts firmados.

Intente escribir esto:

set-executionpolicy remotesigned

Eso le dirá a PowerShell que permita la ejecución de scripts locales (es decir, en una unidad local) sin firmar.

Luego intente ejecutar su script nuevamente.

Matt Hamilton
fuente
5
Debe ejecutar Powershell con privilegios de administrador, ¡al menos en Windows 8!
ComFreek
1
Y también debe ejecutar el script de PowerShell con privilegios administrativos en Windows 7.
Rod
14
Esta es una respuesta bastante aterradora. Por un lado, cambia permanentemente el nivel de seguridad predeterminado de Powershell de formas posiblemente indeseables (e inseguras). Por otro lado, ni siquiera explica adecuadamente que los scripts remotos firmados y los scripts locales sin firmar, pero no los scripts remotos sin firmar, que Chocolatey ocasionalmente requiere, recibirán privilegios de ejecución. La mayoría de los usuarios probablemente quieran esto y esto en su lugar.
Cecil Curry
1
Si bien la preocupación de Cecil por algunas debilidades en la respuesta es justa, quería señalar algunas cosas. 1) Sus dos enlaces parecen abrir la misma página para mí. 2) Si desea que los scripts simplemente se ejecuten, es probable que establecer la política de ejecución siga siendo el camino a seguir, y posiblemente no esté relacionado con OP: 3) parece que la mejor política es para los scripts de inicio, especifique la política de ejecución y el alcance en la línea de comando ejecutando el script, y para iniciar sesión, establezca la configuración de sesión según sea necesario. Si desea una alta seguridad durante la sesión de Windows pero reducida para el inicio de sesión, querrá matizar el orden de su script.
omJohn8372
Para one-shots, encuentro que la respuesta de Ankur a continuación que define una excepción temporal para la instancia de PowerShell en ejecución es la más útil.
Florenz Kley
79

Necesitas ejecutar 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.
Nadeem_MK
fuente
3
¿Cuál es el valor de ExecutionPolicy predeterminado en el que Windows establece una nueva instalación?
Matthew Lock
5
@MatthewLock Restrictedes la política predeterminada. Leer más
Nadeem_MK
24

Utilizar:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Utilice siempre el comando anterior para habilitar la ejecución de PowerShell en la sesión actual.

Naveen
fuente
this + superuser.com/questions/612409/… + enlace directo = perfección
Q20
16

Pude evitar este error invocando PowerShell de esta manera:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Es decir, agregué el -executionpolicy bypass a la forma en que invoqué el script.

Esto funcionó en Windows 7 Service Pack 1. Soy nuevo en PowerShell, por lo que podría haber advertencias para hacer eso que no conozco.

[Editar 2017-06-26] Seguí usando esta técnica en otros sistemas, incluidos Windows 10 y Windows 2012 R2, sin problemas.

Esto es lo que estoy usando ahora. Esto evita que ejecute accidentalmente el script haciendo clic en él. Cuando lo ejecuto en el programador, agrego un argumento: "programador" y eso pasa por alto el indicador.

Esto también pausa la ventana al final para que pueda ver la salida de 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%
si vota NewQuestionCLOSE
fuente
Esto es lo que utiliza chocolatey para descargar e instalar chocolatey
icc97
Intenté ejecutar el comando Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 y recibí un mensaje de error. No existe la opción -File para este comando.
David Spector
Oh ya veo. Debe crear un acceso directo que contenga el comando powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. El comando test.ps1 se ejecuta incluso cuando se ha dado el comando global seguro Set-ExecutionPolicy Restricted. Espero que esta información básica ayude a alguien.
David Spector
5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

El comando anterior funcionó para mí incluso cuando ocurre el siguiente error:

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

También vale la pena saber que es posible que deba incluirlo .\delante del nombre del script. Por ejemplo:

.\scriptname.ps1
Leon Bambrick
fuente
1

El comando set-executionpolicy unrestrictedpermitirá que cualquier script que cree se ejecute como el usuario que inició sesión. Solo asegúrese de volver a establecer la configuración de la política de ejecución en firmado con el set-executionpolicy signedcomando antes de cerrar la sesión.

ExchangeAdmin
fuente
set-executionpolicy signedda, Cannot bind parameter 'ExecutionPolicy'etc.
JinSnow
0

En Windows 10: haga clic en cambiar la propiedad de seguridad de myfile.ps1 y cambie "permitir acceso" haciendo clic con el botón derecho en / properties en myfile.ps1

usuario2781940
fuente