Почему мои сценарии PowerShell не работают?

Я написал простой командный файл в виде сценария PowerShell, и при его запуске возникают ошибки.

Он находится в каталоге сценариев на моем пути. Это ошибка, которую я получаю:

Cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about-signing".

Я заглянул в справку, но она мне не помогла.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
106
0
179 721
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Это может быть уровень безопасности PowerShell по умолчанию, который (IIRC) будет запускать только подписанные сценарии.

Попробуйте ввести это:

set-executionpolicy remotesigned

Это укажет PowerShell разрешить выполнение локальных (то есть на локальном диске) неподписанных сценариев.

Затем попробуйте снова выполнить свой сценарий.

Вы должны запустить Powershell с правами администратора, по крайней мере, под Windows 8!

ComFreek 24.08.2012 15:48

И вы также должны запустить сценарий PowerShell с правами администратора под Windows 7.

Rod 01.03.2014 00:26
Это довольно устрашающий ответ. For one, it постоянно changes Powershell's default security level in possibly undesirable (and insecure) ways. For another, it fails to even adequately explain that signed remote scripts and unsigned local scripts – but нет unsigned remote scripts, which Шоколадный occasionally requires – will be granted execution privileges. Most users probably want это and это instead.
Cecil Curry 07.06.2016 09:30

Хотя беспокойство Сесила по поводу некоторых слабых мест в ответе справедливо, я хотел указать на несколько вещей. 1) Две его ссылки открывают для меня одну и ту же страницу. 2) Если вы хотите, чтобы сценарии просто запускались, установка политики выполнения, вероятно, по-прежнему является подходящим вариантом и, возможно, не связана с OP: 3) кажется, что лучшая политика - для сценариев запуска, укажите политику выполнения и область действия в командной строке запустив сценарий, и для входа в систему установите необходимую конфигурацию сеанса. Если вы хотите обеспечить высокий уровень безопасности во время сеанса Windows, но ограниченный для входа в систему, вам следует уточнить порядок выполнения сценариев.

omJohn8372 01.09.2017 17:45

Для однократных попыток наиболее полезным я считаю Ответ Анкура ниже, определяющий временное исключение для работающего экземпляра PowerShell.

Florenz Kley 21.11.2018 00:27

Также стоит знать, что вам может потребоваться включить .\ перед именем скрипта. Например:

.\scriptname.ps1

Команда set-executionpolicy unrestricted позволит запускать любой созданный вами сценарий от имени вошедшего в систему пользователя. Просто не забудьте установить для параметра «Executionpolicy» значение «подписано» с помощью команды set-executionpolicy signed перед выходом из системы.

set-executionpolicy signed дает Cannot bind parameter 'ExecutionPolicy' и т. д.

JinSnow 16.02.2017 21:22

Использовать:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Всегда используйте указанную выше команду, чтобы разрешить выполнение PowerShell в текущем сеансе.

this + superuser.com/questions/612409/… + ссылка на ярлык = совершенство

Q20 02.04.2018 17:50

Вам нужно запустить 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.

Какое значение ExecutionPolicy по умолчанию, которое Windows устанавливает для новой установки?

Matthew Lock 17.05.2017 09:38

@MatthewLock Restricted - это политика по умолчанию. Прочитайте больше

Nadeem_MK 17.05.2017 13:01

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Вышеупомянутая команда работала у меня, даже когда произошла следующая ошибка:

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

Мне удалось обойти эту ошибку, вызвав PowerShell следующим образом:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

То есть я добавил -executionpolicy bypass к способу вызова сценария.

Это работало с пакетом обновления 1 для Windows 7. Я новичок в PowerShell, поэтому могут быть предостережения, о которых я не знаю.

[Edit 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%

Это то, что шоколадный использует для загрузки и установки шоколадного

icc97 23.01.2018 13:51

Я попытался запустить команду Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 и получил сообщение об ошибке. Для этой команды нет опции -File.

David Spector 09.07.2019 14:37

А ну понятно. Вы должны создать ярлык, содержащий команду powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1. Затем команда test.ps1 запускается, даже если задана безопасная глобальная команда Set-ExecutionPolicy Restricted. Надеюсь, эта основная информация кому-то поможет.

David Spector 09.07.2019 14:42

В Windows 10: Щелкните изменить свойство безопасности myfile.ps1 и измените "разрешить доступ", щелкнув правой кнопкой мыши / свойства на myfile.ps1.

Мы можем обойти политику выполнения красивым способом (внутри командной строки):

type file.ps1 | powershell -command -

Или внутри powershell:

gc file.ps1|powershell -c -

import-module IISAdministration;

function StartSite{
    param($sitename)
    try{
        Start-IISSite -Name $sitename;
        Write-Host "Site was started";
    }
    catch{
        Write-Error "Error while staring the IISSite";
    }
}

function StopSite{
    param($sitename)
    try{
        Stop-IISSite -Name $sitename -confirm:$False; # Supress interaction inputs
        Write-Host "Site was stopped";
    }
    catch{
            Write-Error "Error while stopping the IISSite";
    }
}
function ReplaceSiteFiles{
    try{
        Get-ChildItem -Path A:\APPS\CreditApp -Recurse | Foreach-Object {Remove-Item -Recurse -Path $_.FullName} # Remove file from AppPool Directory
        Expand-Archive A:\Staging\LTA\Installers\CreditApp\CreditApp.zip -DestinationPath A:\APPS\ # Extract files from zip
        Write-Host "Site files replaced successfully!";
    }
    catch [System.SystemException]{
        Write-Host "Error while replacing the site files";
        Write-Host $_
    }
}

## Start Here
$site=Get-IISSite -Name "Default Web Site";

Write-Host $site

if ($site.length -eq 1){

    $siteState = $site.state;
    Write-Host "The Site Exists with state: ${siteState}";

    switch ($siteState)
    {
        'started' { 
                    StopSite -sitename $site.name;
                    ReplaceSiteFiles;
                    StartSite -sitename $site.name;
                    
                  }
        'stopped' { 
                    ReplaceSiteFiles;
                    StartSite -sitename $site.name;
                  }
        default { "Deployment failed! Site state could not be determined.";}
    }    
}

else{
    Write-Error "Invalid! Site does not exists";
}

##  End Here

Другие вопросы по теме