Por que meus scripts do PowerShell não estão em execução?

103

Eu escrevi um arquivo em lote simples como um script do PowerShell e estou recebendo erros quando eles são executados.

Está em um diretório de scripts no meu caminho. Este é o erro que recebo:

Não pode ser carregado porque a execução de scripts está desabilitada neste sistema. Consulte "obter ajuda sobre a assinatura".

Procurei na ajuda, mas não ajudou muito.

DevelopingChris
fonte

Respostas:

102

Pode ser o nível de segurança padrão do PowerShell, que (IIRC) só executará scripts assinados.

Tente digitar isto:

set-executionpolicy remotesigned

Isso dirá ao PowerShell para permitir a execução de scripts não assinados locais (ou seja, em uma unidade local).

Em seguida, tente executar seu script novamente.

Matt Hamilton
fonte
5
Você deve executar o Powershell com privilégios de administrador, pelo menos no Windows 8!
ComFreek
1
E você precisa executar o script do PowerShell com privilégios administrativos no Windows 7 também.
Rod
14
Esta é uma resposta bastante assustadora. Por um lado, ele muda permanentemente o nível de segurança padrão do Powershell de maneiras possivelmente indesejáveis ​​(e inseguras). Por outro lado, ele não consegue nem mesmo explicar adequadamente que scripts remotos assinados e scripts locais não assinados - mas não scripts remotos não assinados, que o Chocolatey ocasionalmente requer - terão privilégios de execução concedidos. A maioria dos usuários provavelmente deseja isso e isso .
Cecil Curry
1
Embora a preocupação de Cecil sobre alguns pontos fracos na resposta seja justa, eu gostaria de destacar algumas coisas. 1) Seus dois links parecem abrir a mesma página para mim. 2) Se você deseja que os scripts simplesmente sejam executados, definir a política de execução provavelmente ainda é o caminho a percorrer, e possivelmente não relacionado ao OP: 3) parece que a melhor política é para scripts de inicialização, especifique a política de execução e o escopo na linha de comando executando o script e, para o logon, defina a configuração da sessão conforme necessário. Se você deseja alta segurança durante a sessão do Windows, mas reduzida para logon, convém obter nuances na ordem do script.
omJohn8372 01 de
Para one-shots, acho que a resposta de Ankur abaixo que define uma exceção temporária para a instância em execução PowerShell o mais útil.
Florenz Kley de
79

Você precisa executar 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
fonte
3
Qual é o valor ExecutionPolicy padrão para o qual o Windows define uma nova instalação?
Matthew Lock
5
@MatthewLock Restrictedé a política padrão. Leia mais
Nadeem_MK
24

Usar:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Sempre use o comando acima para habilitar a execução do PowerShell na sessão atual.

Naveen
fonte
this + superuser.com/questions/612409/… + link de atalho = perfeição
Q20
16

Consegui contornar esse erro invocando o PowerShell assim:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Ou seja, adicionei o -executionpolicy bypassà forma como invoquei o script.

Isso funcionou no Windows 7 Service Pack 1. Eu sou novo no PowerShell, então pode haver restrições para fazer isso que eu não estou ciente.

[Editar 26-06-2017] Continuei a usar essa técnica em outros sistemas, incluindo Windows 10 e Windows 2012 R2, sem problemas.

Aqui está o que estou usando agora. Isso me impede de executar acidentalmente o script clicando nele. Quando eu o executo no planejador, adiciono um argumento: "planejador" e isso ignora o prompt.

Isso também pausa a janela no final para que eu possa ver a saída do 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%
se NewQuestion voteCLOSE
fonte
Isso é o que o chocolatey usa para baixar e instalar o chocolatey
icc97
Tentei executar o comando Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 e recebi uma mensagem de erro. Não há opção -File para este comando.
David Spector
Ah eu vejo. Você deve criar um atalho contendo o comando powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. O comando test.ps1 é então executado mesmo quando o comando global seguro Set-ExecutionPolicy Restricted é fornecido. Espero que esta informação básica ajude alguém.
David Spector
5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

O comando acima funcionou para mim mesmo quando o seguinte erro acontece:

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

Também vale a pena saber que você pode precisar incluir .\antes do nome do script. Por exemplo:

.\scriptname.ps1
Leon Bambrick
fonte
1

O comando set-executionpolicy unrestrictedpermitirá que qualquer script criado por você seja executado como o usuário conectado. Apenas certifique-se de definir a configuração de execução da política de volta para assinado usando o set-executionpolicy signedcomando antes de fazer logout

ExchangeAdmin
fonte
set-executionpolicy signedCannot bind parameter 'ExecutionPolicy'etc.
JinSnow
0

No Windows 10: Clique em alterar propriedade de segurança de myfile.ps1 e altere "permitir acesso" clicando com o botão direito / propriedades em myfile.ps1

user2781940
fonte