Подтвердить что ты не робот

Вызов PowerShell script из Python

Я пытаюсь запустить PowerShell script из 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\рабочей\MyProject\buildxml.ps1 не может быть загружена, так как выполнение сценариев отключено на этом система. Подробнее см. "Get-help about_signing".

НЕЗАВИСИМЫЙ факт, что я давно включил запуск сценариев в Powershell, набрав Set-ExecutionPolicy Unrestriced в управляемом администратором PS терминале (и снова сделал это, чтобы убедиться). Исполняемый файл powershell аналогичен ярлыку в меню "Пуск". Get-ExecutionPolicy правильно сообщает Unrestricted независимо от того, запускал ли я PowerShell как admin или нет.

Как я могу правильно выполнить PS script с Python?

4b9b3361

Ответ 1

Во-первых, 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')

Ответ 2

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

Write-Host $args[0]
Write-Host $args[1]
Write-Host $args[2]