Dlaczego moje skrypty PowerShell nie działają?


104

Napisałem prosty plik wsadowy jako skrypt PowerShell i otrzymuję błędy podczas ich uruchamiania.

Znajduje się w katalogu skryptów w mojej ścieżce. Oto błąd, który otrzymuję:

Nie można załadować, ponieważ wykonywanie skryptów jest wyłączone w tym systemie. Zobacz „Uzyskaj pomoc dotyczącą podpisywania”.

Szukałem pomocy, ale to mniej niż pomocne.

Odpowiedzi:


102

Może to być domyślny poziom bezpieczeństwa PowerShell, który (IIRC) będzie uruchamiał tylko podpisane skrypty.

Spróbuj wpisać to:

set-executionpolicy remotesigned

To powie PowerShell, aby zezwolił na uruchamianie lokalnych (to znaczy na dysku lokalnym) niepodpisanych skryptów.

Następnie spróbuj ponownie wykonać skrypt.


5
Musisz uruchomić Powershell z uprawnieniami administratora, przynajmniej pod Windows 8!
ComFreek

1
Musisz także uruchomić skrypt PowerShell z uprawnieniami administratora w systemie Windows 7.
Rod

14
To dość przerażająca odpowiedź. Po pierwsze, trwale zmienia domyślny poziom bezpieczeństwa programu PowerShell w potencjalnie niepożądany (i niepewny) sposób. Po drugie, nie wyjaśnia nawet odpowiednio, że podpisane zdalne skrypty i niepodpisane skrypty lokalne - ale nie niepodpisane zdalne skrypty, których czasami wymaga Chocolatey - otrzymają uprawnienia do wykonywania. Większość użytkowników prawdopodobnie chce tego i tego zamiast tego .
Cecil Curry

1
Chociaż obawy Cecila dotyczące niektórych słabych punktów odpowiedzi są słuszne, chciałem zwrócić uwagę na kilka rzeczy. 1) Jego dwa linki wydają się otwierać dla mnie tę samą stronę. 2) Jeśli chcesz, aby skrypty po prostu uruchamiały się, ustawienie polityki wykonywania jest prawdopodobnie nadal właściwą drogą i prawdopodobnie nie ma związku z OP: 3) wydaje się, że najlepszą zasadą jest dla skryptów startowych, określ zasady wykonywania i zakres w wierszu poleceń uruchomienie skryptu i ustawienie konfiguracji sesji zgodnie z potrzebami podczas logowania. Jeśli chcesz mieć wysoki poziom bezpieczeństwa podczas sesji systemu Windows, ale ograniczony do logowania, chcesz uzyskać niuanse w kolejności skryptów.
omJohn8372

W przypadku pojedynczych ujęć najbardziej pomocna jest poniższa odpowiedź Ankur, która definiuje tymczasowy wyjątek dla działającej instancji PowerShell.
Florenz Kley,

79

Musisz biegać 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.

3
Jaka jest domyślna wartość ExecutionPolicy, na którą system Windows ustawia nową instalację?
Matthew Lock

5
@MatthewLock Restrictedjest zasadą domyślną. Czytaj więcej
Nadeem_MK

24

Posługiwać się:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Zawsze używaj powyższego polecenia, aby umożliwić wykonywanie programu PowerShell w bieżącej sesji.


this + superuser.com/questions/612409/ ... + skrót link = perfekcja
Q20

16

Udało mi się ominąć ten błąd, wywołując PowerShell w następujący sposób:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Oznacza to, że dodałem -executionpolicy bypassdo sposobu wywoływania skryptu.

To działało w systemie Windows 7 z dodatkiem Service Pack 1. Jestem nowy w programie PowerShell, więc mogą istnieć zastrzeżenia dotyczące robienia tego, których nie jestem świadomy.

[Edytuj 2017-06-26] Nadal bez problemu korzystam z tej techniki w innych systemach, w tym Windows 10 i Windows 2012 R2.

Oto, czego teraz używam. Dzięki temu nie mogę przypadkowo uruchomić skryptu, klikając go. Kiedy uruchamiam go w programie planującym, dodaję jeden argument: „harmonogram”, który omija monit.

To również zatrzymuje okno na końcu, więc mogę zobaczyć dane wyjściowe 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%

To właśnie używa chocolatey do pobierania i instalowania chocolatey
icc97

Próbowałem uruchomić polecenie Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 i otrzymałem komunikat o błędzie. Nie ma opcji -File dla tego polecenia.
David Spector,

Rozumiem. Musisz utworzyć skrót zawierający polecenie powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. Polecenie test.ps1 jest następnie uruchamiane nawet po wydaniu bezpiecznego polecenia globalnego Set-ExecutionPolicy Restricted. Mam nadzieję, że te podstawowe informacje komuś pomogą.
David Spector,

5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Powyższe polecenie działało dla mnie nawet wtedy, gdy wystąpi następujący błąd:

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

5

Warto również wiedzieć, że może być konieczne umieszczenie .\przed nazwą skryptu. Na przykład:

.\scriptname.ps1

1

Polecenie set-executionpolicy unrestrictedpozwoli każdemu utworzonemu skryptowi na uruchomienie jako zalogowany użytkownik. Po prostu upewnij się, że ustawiłeś zasady wykonywania z powrotem na podpisane za pomocą set-executionpolicy signedpolecenia przed wylogowaniem.


set-executionpolicy signeddaje Cannot bind parameter 'ExecutionPolicy'itp.
JinSnow

0

W systemie Windows 10: kliknij opcję zmień właściwość zabezpieczeń pliku myfile.ps1 i zmień opcję „zezwól na dostęp”, klikając prawym przyciskiem myszy / właściwości na pliku myfile.ps1

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.