Почему не выполняются мои сценарии PowerShell?

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

Это в каталоге скриптов в моем пути.

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

Я посмотрел в справке, но это менее чем полезно.

7 ответов

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

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

    set-executionpolicy remotesigned
    

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

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

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

    .\scriptname.ps1
    
  3. Команда set-executionpolicy unrestrictedпозволит любому созданному вами скрипту запускаться от имени вошедшего в систему пользователя. Перед выходом из системы обязательно установите для параметра executionpolicy значение подписано с помощью set-executionpolicy signedкоманды.

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

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
    

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

  5. Вам нужно бежать 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.
    
  6. Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
    

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

    Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell
    	

    It could be PowerShell's default security level, which (IIRC) will only run signed scripts.

    Try typing this:

    set-executionpolicy remotesigned
    

    That will tell PowerShell to allow local (that is, on a local drive) unsigned scripts to run.

    Then try executing your script again.

    You need to run 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.
    

    Use:

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
    

    Always use the above command to enable to executing PowerShell in the current session.

    I was able to bypass this error by invoking PowerShell like this:

    powershell -executionpolicy bypass -File .\MYSCRIPT.ps1
    

    That is, I added the -executionpolicy bypass to the way I invoked the script.

    This worked on Windows 7 Service Pack 1. I am new to PowerShell, so there could be caveats to doing that that I am not aware of.

    [Edit 2017-06-26] I have continued to use this technique on other systems including Windows 10 and Windows 2012 R2 without issue.

    Here is what I am using now. This keeps me from accidentally running the script by clicking on it. When I run it in the scheduler I add one argument: "scheduler" and that bypasses the prompt.

    This also pauses the window at the end so I can see the output of 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%
    
    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
    

    The above command worked for me even when the following error happens:

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

    Also it's worth knowing that you may need to include .\ in front of the script name. For example:

    .\scriptname.ps1
    

    The command set-executionpolicy unrestricted will allow any script you create to run as the logged in user. Just be sure to set the executionpolicy setting back to signed using the set-executionpolicy signed command prior to logging out.

    \ShellIds\Microsoft.PowerShell' is denied.

  7. Я смог обойти эту ошибку, вызвав PowerShell следующим образом:

    powershell -executionpolicy bypass -File .\MYSCRIPT.ps1
    

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

    Это работало на Windows 7 пакет обновления 1. Я новичок в 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%