Вызов скрипта PowerShell из Python - PullRequest
15 голосов
/ 01 августа 2011

Я пытаюсь запустить скрипт PowerShell из python, например:

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                             './buildxml.ps1',
                             arg1, arg2, arg3], cwd=os.getcwd())
result = psxmlgen.wait()

Проблема в том, что я получаю следующую ошибку:

Файл C: \ Users\ sztomi \ workspace \ myproject \ buildxml.ps1 не может быть загружен, так как в этой системе отключено выполнение сценариев.Пожалуйста, смотрите "get-help about_signing" для получения более подробной информации.

УЖАСИТЕ тот факт, что я давным-давно включил запуск скриптов в Powershell, набрав Set-ExecutionPolicy Unrestriced в терминале PS, управляемом администратором (исделал еще раз, просто чтобы убедиться).Исполняемый файл powershell является тем же, на который указывает ярлык в меню «Пуск».Get-ExecutionPolicy правильно сообщает Unrestricted независимо от того, запускал ли я PowerShell от имени администратора или нет.

Как правильно выполнить скрипт PS из Python?

Ответы [ 2 ]

16 голосов
/ 01 августа 2011

Во-первых, Set-ExecutionPolicy Unrestriced для каждого пользователя и для каждого бита (32-разрядный отличается от 64-разрядного).

Во-вторых, вы можете переопределить политику выполнения из командной строки.

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                             '-ExecutionPolicy',
                             'Unrestricted',
                             './buildxml.ps1',
                             arg1, arg2, arg3], cwd=os.getcwd())
result = psxmlgen.wait()

Видимо, вы можете получить доступ к 64-битной PowerShell из 32-битной PowerShell по этому пути (спасибо @eryksun в комментариях):

powershell64 = os.path.join(os.environ['SystemRoot'], 
    'SysNative' if platform.architecture()[0] == '32bit' else 'System32',
    'WindowsPowerShell', 'v1.0', 'powershell.exe')
0 голосов
/ 28 февраля 2017

Для тех из нас, кто хотел знать, как отображать значения arg1, arg2 и arg3 после того, как они были переданы в powershell, все, что вам нужно сделать, это:

Write-Host $args[0]
Write-Host $args[1]
Write-Host $args[2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...