¿Por qué no se ejecutan mis scripts de PowerShell?
-
08-06-2019 - |
Pregunta
Escribí un archivo por lotes simple como un script de PowerShell y recibo errores cuando se ejecuta.
Está en un directorio de scripts en mi camino.
Cannot be loaded because the execution of scripts is disabled on this system.
please see "get-help about-signing".
Miré en la ayuda, pero es poco útil.
Solución
Podría ser el nivel de seguridad predeterminado de PowerShell, que (IIRC) solo ejecutará scripts firmados.
Intenta escribir esto:
set-executionpolicy remotesigned
Esto le indicará a PowerShell que permita la ejecución de scripts no firmados locales (es decir, en una unidad local).
Luego intente ejecutar su script nuevamente.
Otros consejos
necesitas correr 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.
Usar:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Utilice siempre el comando anterior para habilitar la ejecución de PowerShell en la sesión actual.
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 guión.
Esto funcionó en Windows 7 Service Pack 1.Soy nuevo en PowerShell, por lo que podría haber advertencias al hacerlo que desconozco.
[Editar 2017-06-26] Continué 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 al hacer clic en él.Cuando lo ejecuto en el programador agrego un argumento:"programador" y eso omite el mensaje.
Esto también detiene la ventana al final para que pueda ver el resultado 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%
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.
También vale la pena saber que es posible que deba incluir .\
delante del nombre del script.Por ejemplo:
.\scriptname.ps1
El comando set-executionpolicy unrestricted
permitirá que cualquier script que cree se ejecute como el usuario que inició sesión.Sólo asegúrese de volver a establecer la configuración de la política de ejecución en firmada usando el set-executionpolicy signed
comando antes de cerrar sesión.