PowerShell komut dosyalarım neden çalışmıyor?


104

PowerShell betiği olarak basit bir toplu iş dosyası yazdım ve çalıştırdıklarında hatalar alıyorum.

Yolumdaki bir betik dizininde. Aldığım hata bu:

Bu sistemde betiklerin yürütülmesi devre dışı bırakıldığı için yüklenemiyor. Lütfen "imzalama hakkında yardım alma" konusuna bakın.

Yardıma baktım, ama faydası olmadı.

Yanıtlar:


102

PowerShell'in varsayılan güvenlik seviyesi olabilir ve bu (IIRC) yalnızca imzalı komut dosyalarını çalıştırır.

Şunu yazmayı deneyin:

set-executionpolicy remotesigned

Bu, PowerShell'e yerel (yani, yerel bir sürücüde) imzasız komut dosyalarının çalıştırılmasına izin vermesini söyleyecektir.

Ardından komut dosyanızı yeniden çalıştırmayı deneyin.


5
Powershell'i en azından Windows 8 altında yönetici ayrıcalıklarıyla çalıştırmalısınız!
ComFreek

1
PowerShell betiğini Windows 7 altında da yönetici ayrıcalıklarıyla çalıştırmanız gerekir.
Çubuk

14
Bu oldukça ürkütücü bir cevap. Birincisi, Powershell'in varsayılan güvenlik seviyesini muhtemelen istenmeyen (ve güvensiz) şekillerde kalıcı olarak değiştirir. Ama - Bir başka açıdan, hatta yeterince uzak komut dosyalarını ve imzasız yerel komut dosyalarını imzalı açıklamaya başarısız değil imzasız uzaktan komut, chocolatey bazen gerektirir - yürütme yetkileri verilecektir. Çoğu kullanıcı muhtemelen bunu ve bunun yerine bunu ister .
Cecil Curry

1
Cecil'in cevaptaki bazı zayıflıklar konusundaki endişesi adil olsa da, birkaç şeye dikkat çekmek istedim. 1) İki bağlantısı benim için aynı sayfayı açıyor gibi görünüyor. 2) Komut dosyalarının basitçe çalışmasını istiyorsanız, yürütme politikasını ayarlamak muhtemelen hala gidilecek yoldur ve muhtemelen OP ile ilgisiz: 3) en iyi politika başlangıç ​​komut dosyaları içindir, komut satırında yürütme politikasını ve kapsamını belirtin betiği çalıştırmak ve oturum açmak için oturum yapılandırmasını gerektiği gibi ayarlayın. Windows oturumu sırasında yüksek güvenlik istiyor ancak oturum açma için azaltılmışsa, komut dosyası sıranızda nüanslı olmak istersiniz.
omJohn8372

Tek çekim için, çalışan PowerShell örneği için geçici bir istisna tanımlayan Ankur'un yanıtını en yararlı buluyorum .
Florenz Kley

79

Çalıştırmanız gerekiyor 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
Windows'un yeni bir yüklemeyi ayarladığı varsayılan ExecutionPolicy değeri nedir?
Matthew Lock

5
@MatthewLock Restrictedvarsayılan ilkedir. Devamını Oku
Nadeem_MK

24

Kullanım:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Geçerli oturumda PowerShell'i çalıştırmayı etkinleştirmek için her zaman yukarıdaki komutu kullanın.


this + superuser.com/questions/612409/… + kısayol bağlantısı = mükemmellik
Q20

16

PowerShell'i şu şekilde çalıştırarak bu hatayı atlayabildim:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Yani, -executionpolicy bypasssenaryoyu çağırma şeklime ekledim .

Bu, Windows 7 Service Pack 1'de çalıştı. PowerShell'de yeniyim, bu yüzden bunu yapmanın farkında olmadığım uyarılar olabilir.

[Düzenleme 2017-06-26] Bu tekniği Windows 10 ve Windows 2012 R2 dahil diğer sistemlerde sorunsuz kullanmaya devam ettim.

İşte şimdi kullandığım şey. Bu, betiğe tıklayarak yanlışlıkla komut dosyasını çalıştırmamı engelliyor. Bunu zamanlayıcıda çalıştırdığımda bir bağımsız değişken ekliyorum: "zamanlayıcı" ve bu komut istemini atlıyor.

Bu aynı zamanda pencereyi sonunda duraklatıyor, böylece PowerShell'in çıktısını görebiliyorum.

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%

Bu, chocolatey'nin chocolatey'i indirmek ve yüklemek için kullandığı
şeydir

Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 komutunu çalıştırmayı denedim ve bir hata mesajı aldım. Bu komut için -File seçeneği yoktur.
David Spector

Ah anlıyorum. Powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 komutunu içeren bir kısayol yapmanız gerekir. Daha sonra test.ps1 komutu, güvenli global Set-ExecutionPolicy Restricted komutu verildiğinde bile çalıştırılır. Umarım bu temel bilgiler birine yardımcı olur.
David Spector

5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Yukarıdaki komut, aşağıdaki hata meydana geldiğinde bile benim için çalıştı:

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

5

Ayrıca .\komut dosyası adının önüne eklemeniz gerekebileceğini bilmeye değer . Örneğin:

.\scriptname.ps1

1

Komut set-executionpolicy unrestricted, oluşturduğunuz herhangi bir komut dosyasının oturum açmış kullanıcı olarak çalışmasına izin verecektir. Oturumu set-executionpolicy signedkapatmadan önce komutu kullanarak yürütme politikası ayarını tekrar imzalanmış olarak ayarladığınızdan emin olun .


set-executionpolicy signedCannot bind parameter 'ExecutionPolicy'vb. verir
JinSnow

0

Windows 10'da: myfile.ps1'in güvenlik özelliğini değiştir'i tıklayın ve myfile.ps1 üzerinde sağ tıklama / özellikler ile "erişime izin ver" seçeneğini değiştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.