Pourquoi mes scripts PowerShell ne s’exécutent-ils pas ?
-
08-06-2019 - |
Question
J'ai écrit un simple fichier batch sous forme de script PowerShell et j'obtiens des erreurs lors de leur exécution.
C'est dans un répertoire de scripts sur mon chemin.
Cannot be loaded because the execution of scripts is disabled on this system.
please see "get-help about-signing".
J'ai regardé dans l'aide, mais c'est loin d'être utile.
La solution
Il pourrait s'agir du niveau de sécurité par défaut de PowerShell, qui (IIRC) n'exécutera que des scripts signés.
Essayez de taper ceci :
set-executionpolicy remotesigned
Cela indiquera à PowerShell d'autoriser l'exécution de scripts locaux (c'est-à-dire sur un lecteur local) non signés.
Essayez ensuite d'exécuter à nouveau votre script.
Autres conseils
Tu dois courir 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.
Utiliser:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Utilisez toujours la commande ci-dessus pour activer l'exécution de PowerShell dans la session en cours.
J'ai pu contourner cette erreur en appelant PowerShell comme ceci :
powershell -executionpolicy bypass -File .\MYSCRIPT.ps1
Autrement dit, j'ai ajouté le -executionpolicy bypass
à la façon dont j'ai invoqué le script.
Cela a fonctionné sous Windows 7 Service Pack 1.Je suis nouveau sur PowerShell, il pourrait donc y avoir des mises en garde à ce sujet dont je ne suis pas au courant.
[Modifier 26/06/2017] J'ai continué à utiliser cette technique sur d'autres systèmes, notamment Windows 10 et Windows 2012 R2, sans problème.
Voici ce que j'utilise maintenant.Cela m'empêche d'exécuter accidentellement le script en cliquant dessus.Lorsque je l'exécute dans le planificateur, j'ajoute un argument :"planificateur" et cela contourne l'invite.
Cela met également la fenêtre en pause à la fin afin que je puisse voir la sortie 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
La commande ci-dessus a fonctionné pour moi même lorsque l'erreur suivante se produit :
Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.
Il convient également de savoir que vous devrez peut-être inclure .\
devant le nom du script.Par exemple:
.\scriptname.ps1
La commande set-executionpolicy unrestricted
permettra à tout script que vous créez de s'exécuter en tant qu'utilisateur connecté.Assurez-vous simplement de redéfinir le paramètre de stratégie d'exécution sur signé à l'aide du set-executionpolicy signed
commande avant de vous déconnecter.