เหตุใดสคริปต์ PowerShell ของฉันจึงไม่ทำงาน


104

ฉันเขียนแบตช์ไฟล์ธรรมดาเป็นสคริปต์ PowerShell และฉันได้รับข้อผิดพลาดเมื่อเรียกใช้

อยู่ในไดเรกทอรีสคริปต์ในเส้นทางของฉัน นี่คือข้อผิดพลาดที่ฉันได้รับ:

ไม่สามารถโหลดได้เนื่องจากการเรียกใช้สคริปต์ถูกปิดใช้งานบนระบบนี้ โปรดดู "ขอความช่วยเหลือเกี่ยวกับการลงนาม"

ฉันดูความช่วยเหลือแล้ว แต่ก็มีประโยชน์น้อยกว่า

คำตอบ:


102

อาจเป็นระดับความปลอดภัยเริ่มต้นของ PowerShell ซึ่ง (IIRC) จะเรียกใช้สคริปต์ที่เซ็นชื่อเท่านั้น

ลองพิมพ์สิ่งนี้:

set-executionpolicy remotesigned

ซึ่งจะบอกให้ PowerShell อนุญาตให้สคริปต์ที่ไม่ได้ลงชื่อในเครื่อง (บนไดรฟ์ในเครื่อง) ทำงานได้

จากนั้นลองเรียกใช้สคริปต์ของคุณอีกครั้ง


5
คุณต้องเรียกใช้ Powershell ด้วยสิทธิ์ของผู้ดูแลระบบอย่างน้อยก็ใน Windows 8!
ComFreek

1
และคุณต้องเรียกใช้สคริปต์ PowerShell ด้วยสิทธิ์ระดับผู้ดูแลระบบภายใต้ Windows 7 ด้วย
Rod

14
นี่เป็นคำตอบที่น่ากลัวพอสมควร ประการแรกระบบจะเปลี่ยนระดับความปลอดภัยเริ่มต้นของ Powershell อย่างถาวรในรูปแบบที่ไม่พึงปรารถนา (และไม่ปลอดภัย) สำหรับอีกเรื่องหนึ่งก็ไม่สามารถอธิบายได้อย่างเพียงพอว่าสคริปต์ระยะไกลที่ลงนามและสคริปต์ภายในที่ไม่ได้ลงชื่อ - แต่ไม่ใช่สคริปต์ระยะไกลที่ไม่ได้ลงชื่อซึ่งChocolateyต้องการเป็นครั้งคราวจะได้รับสิทธิ์ในการดำเนินการ ผู้ใช้ส่วนใหญ่อาจต้องการนี้และนี้แทน
Cecil Curry

1
ในขณะที่ความกังวลของ Cecil เกี่ยวกับจุดอ่อนบางอย่างในคำตอบนั้นยุติธรรม แต่ฉันต้องการชี้ให้เห็นบางสิ่ง 1) ลิงก์ทั้งสองของเขาดูเหมือนจะเปิดหน้าเดียวกันสำหรับฉัน 2) หากคุณต้องการให้สคริปต์ทำงานเพียงอย่างเดียวการตั้งค่านโยบายการดำเนินการอาจยังคงเป็นไปได้และอาจไม่เกี่ยวข้องกับ OP: 3) ดูเหมือนว่านโยบายที่ดีที่สุดสำหรับสคริปต์เริ่มต้นระบุนโยบายการดำเนินการและขอบเขตในบรรทัดคำสั่ง รันสคริปต์และสำหรับการเข้าสู่ระบบตั้งค่าคอนฟิกูเรชันเซสชันตามต้องการ หากคุณต้องการความปลอดภัยสูงในระหว่างเซสชัน Windows แต่ลดลงสำหรับการเข้าสู่ระบบคุณจะต้องมีความเหมาะสมในลำดับสคริปต์ของคุณ
omJohn8372

สำหรับภาพเดียวฉันพบคำตอบของ Ankur ด้านล่างซึ่งกำหนดข้อยกเว้นชั่วคราวสำหรับอินสแตนซ์ PowerShell ที่ทำงานอยู่ซึ่งมีประโยชน์มากที่สุด
Florenz Kley

79

คุณต้องเรียกใช้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
ค่า ExecutionPolicy เริ่มต้นที่ Windows ตั้งค่าการติดตั้งใหม่เป็นเท่าใด
Matthew Lock

5
@MatthewLock Restrictedเป็นนโยบายเริ่มต้น อ่านเพิ่มเติม
Nadeem_MK


16

ฉันสามารถข้ามข้อผิดพลาดนี้ได้โดยเรียกใช้ PowerShell ดังนี้:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

นั่นคือฉันเพิ่ม-executionpolicy bypassวิธีที่ฉันเรียกใช้สคริปต์

สิ่งนี้ใช้ได้กับ Windows 7 Service Pack 1 ฉันยังใหม่กับ PowerShell ดังนั้นจึงอาจมีข้อควรระวังในการทำสิ่งที่ฉันไม่รู้

[แก้ไข 2017-06-26] ฉันยังคงใช้เทคนิคนี้ในระบบอื่น ๆ รวมถึง Windows 10 และ Windows 2012 R2 โดยไม่มีปัญหา

นี่คือสิ่งที่ฉันใช้ตอนนี้ สิ่งนี้ป้องกันไม่ให้ฉันเรียกใช้สคริปต์โดยไม่ได้ตั้งใจโดยคลิกที่มัน เมื่อฉันเรียกใช้ในตัวกำหนดตารางเวลาฉันจะเพิ่มอาร์กิวเมนต์หนึ่งรายการ: "ตัวกำหนดตารางเวลา" และข้ามพรอมต์

นอกจากนี้ยังหยุดหน้าต่างในตอนท้ายเพื่อให้ฉันเห็นผลลัพธ์ของ 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%

นี่คือสิ่งที่chocolateyใช้ในการดาวน์โหลดและติดตั้ง chocolatey
icc97

ฉันลองเรียกใช้คำสั่ง Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 และได้รับข้อความแสดงข้อผิดพลาด ไม่มีอ็อพชัน -File สำหรับคำสั่งนี้
David Spector

อ้อเข้าใจแล้ว. คุณต้องสร้างทางลัดที่มีคำสั่ง powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 จากนั้นคำสั่ง test.ps1 จะถูกรันแม้ว่าจะมีการกำหนดคำสั่งเซฟโกลบอล Set-ExecutionPolicy Restricted ฉันหวังว่าข้อมูลพื้นฐานนี้จะช่วยใครบางคนได้
David Spector

5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

คำสั่งดังกล่าวใช้ได้ผลสำหรับฉันแม้ว่าจะเกิดข้อผิดพลาดต่อไปนี้:

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

5

นอกจากนี้ยังควรทราบว่าคุณอาจต้องใส่.\ไว้หน้าชื่อสคริปต์ ตัวอย่างเช่น:

.\scriptname.ps1

1

คำสั่งset-executionpolicy unrestrictedจะอนุญาตให้สคริปต์ใด ๆ ที่คุณสร้างขึ้นเพื่อเรียกใช้ในฐานะผู้ใช้ที่ล็อกอิน เพียงตรวจสอบให้แน่ใจว่าได้ตั้งค่าการดำเนินการนโยบายกลับเป็นเซ็นชื่อโดยใช้set-executionpolicy signedคำสั่งก่อนที่จะออกจากระบบ


set-executionpolicy signedให้Cannot bind parameter 'ExecutionPolicy'ฯลฯ
JinSnow

0

ใน Windows 10: คลิกเปลี่ยนคุณสมบัติความปลอดภัยของ myfile.ps1 และเปลี่ยน "allow access" โดยคลิกขวา / properties บน myfile.ps1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.