Tại sao các tập lệnh PowerShell của tôi không chạy?


103

Tôi đã viết một tệp lô đơn giản dưới dạng tập lệnh PowerShell và tôi gặp lỗi khi chúng chạy.

Nó nằm trong một thư mục script trong đường dẫn của tôi. Đây là lỗi tôi nhận được:

Không thể tải vì việc thực thi tập lệnh bị tắt trên hệ thống này. Vui lòng xem "nhận trợ giúp về việc ký".

Tôi đã tìm kiếm sự trợ giúp, nhưng nó ít hữu ích hơn.

Câu trả lời:


102

Đó có thể là mức bảo mật mặc định của PowerShell, (IIRC) sẽ chỉ chạy các tập lệnh đã ký.

Hãy thử gõ cái này:

set-executionpolicy remotesigned

Điều đó sẽ yêu cầu PowerShell cho phép các tập lệnh chưa được ký cục bộ (nghĩa là trên ổ đĩa cục bộ) chạy.

Sau đó, hãy thử thực thi lại tập lệnh của bạn.


5
Bạn phải chạy Powershell với đặc quyền của quản trị viên, ít nhất là trong Windows 8!
ComFreek

1
Và bạn cũng phải chạy tập lệnh PowerShell với các đặc quyền quản trị trong Windows 7.
Rod

14
Đây là một câu trả lời khá đáng sợ. Thứ nhất, nó thay đổi vĩnh viễn mức bảo mật mặc định của Powershell theo những cách có thể không mong muốn (và không an toàn). Đối với một người khác, nó thậm chí không giải thích được đầy đủ rằng các tập lệnh từ xa đã ký và các tập lệnh cục bộ chưa được ký - nhưng không phải là các tập lệnh từ xa chưa được ký, mà Chocolatey đôi khi yêu cầu - sẽ được cấp đặc quyền thực thi. Hầu hết người dùng có thể muốn điều nàyđiều này thay thế.
Cecil Curry vào

1
Trong khi mối quan tâm của Cecil về một số điểm yếu trong câu trả lời là công bằng, tôi muốn chỉ ra một vài điều. 1) Hai liên kết của anh ấy dường như mở cùng một trang cho tôi. 2) Nếu bạn muốn các tập lệnh chạy đơn giản, thiết lập chính sách thực thi có lẽ vẫn là cách để thực hiện và có thể không liên quan đến OP: 3) có vẻ như chính sách tốt nhất dành cho các tập lệnh khởi động, hãy chỉ định chính sách thực thi và phạm vi trong dòng lệnh chạy tập lệnh và để đăng nhập, hãy đặt cấu hình phiên nếu cần. Nếu bạn muốn bảo mật cao trong phiên Windows nhưng bị giảm cho đăng nhập, bạn muốn có nhiều sắc thái trong thứ tự tập lệnh của mình.
omJohn8372

Đối với một bức ảnh, tôi thấy câu trả lời của Ankur dưới đây xác định một ngoại lệ tạm thời cho phiên bản PowerShell đang chạy là hữu ích nhất.
Florenz Kley

79

Bạn cần chạy 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
Giá trị ExecutionPolicy mặc định mà Windows đặt một cài đặt mới là gì?
Matthew Lock

5
@MatthewLock Restrictedlà chính sách mặc định. Đọc thêm
Nadeem_MK

24

Sử dụng:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Luôn sử dụng lệnh trên để cho phép thực thi PowerShell trong phiên hiện tại.


this + superuser.com/questions/612409/… + liên kết rút gọn = hoàn thiện
Q20

16

Tôi đã có thể bỏ qua lỗi này bằng cách gọi PowerShell như sau:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Đó là, tôi đã thêm vào -executionpolicy bypasscách tôi gọi kịch bản.

Điều này hoạt động trên Windows 7 Service Pack 1. Tôi mới sử dụng PowerShell, vì vậy có thể có những lưu ý khi thực hiện điều đó mà tôi không biết.

[Chỉnh sửa 2017-06-26] Tôi đã tiếp tục sử dụng kỹ thuật này trên các hệ thống khác bao gồm Windows 10 và Windows 2012 R2 mà không gặp sự cố.

Đây là những gì tôi đang sử dụng bây giờ. Điều này giúp tôi không vô tình chạy tập lệnh bằng cách nhấp vào nó. Khi tôi chạy nó trong bộ lập lịch, tôi thêm một đối số: "bộ lập lịch" và điều đó sẽ bỏ qua lời nhắc.

Thao tác này cũng tạm dừng cửa sổ ở cuối để tôi có thể xem đầu ra của 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%

Đây là những gì chocolatey sử dụng để tải về và cài đặt chocolatey
icc97

Tôi đã thử chạy lệnh Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 và nhận được thông báo lỗi. Không có tùy chọn -File cho lệnh này.
David Spector

Ồ, tôi hiểu rồi. Bạn phải tạo một phím tắt chứa lệnh powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. Sau đó, lệnh test.ps1 được chạy ngay cả khi lệnh toàn cục an toàn Set-ExecutionPolicy Restricted đã được đưa ra. Tôi hy vọng thông tin cơ bản này sẽ giúp ai đó.
David Spector,

5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Lệnh trên phù hợp với tôi ngay cả khi xảy ra lỗi sau:

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

5

Ngoài ra, cần biết rằng bạn có thể cần phải đưa .\vào trước tên tập lệnh. Ví dụ:

.\scriptname.ps1

1

Lệnh set-executionpolicy unrestrictedsẽ cho phép bất kỳ tập lệnh nào bạn tạo chạy với tư cách người dùng đã đăng nhập. Chỉ cần đảm bảo đặt cài đặt chính sách thực thi trở lại đã ký bằng set-executionpolicy signedlệnh trước khi đăng xuất.


set-executionpolicy signedcho Cannot bind parameter 'ExecutionPolicy'vv
JinSnow

0

Trên Windows 10: Nhấp vào thay đổi thuộc tính bảo mật của myfile.ps1 và thay đổi "cho phép truy cập" bằng cách nhấp chuột phải / thuộc tính trên myfile.ps1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.