Выполнение команд PowerShell с помощью Python 3.5 - PullRequest
0 голосов
/ 18 января 2019

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

import subprocess
try:
    output = subprocess.check_output\
    (["Write-Output 'Hello world'"], shell=True)
    # (["dir"], shell=True)
except subprocess.CalledProcessError as e:
    print(e.output)
    print('^Error Output^')

Если я использую текущую команду с командой check_output, я получаю сообщение об ошибке:

'"Write-Output 'Hello world'"' is not recognized as an internal or external command,
operable program or batch file.

Если я просто использую строку "dir", скрипт будет работать нормально. Я не согласен с тем, почему это произойдет. Это не тот скрипт, который я запускаю, но он вызывает ту же проблему на моей машине. Если я просто наберу проблемную команду в командной строке, она выведет "Hello world" на новую строку, как и ожидалось.

Любое понимание того, почему это будет происходить, будет высоко оценено. Если это уместно, я бы не хотел использовать какой-либо обходной путь с правами администратора.

1 Ответ

0 голосов
/ 18 января 2019

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

Например


POWERSHELL_COMMAND = r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe'

subprocess.Popen([POWERSHELL_COMMAND,
                  '-ExecutionPolicy', 'Unrestricted',
                  'Write-Output', 'Hello World'],
                  stdout = subprocess.PIPE,
                  stderr = subprocess.PIPE)

если powershell не находится в пути, вы можете использовать полный путь для исполняемого файла или, если он находится в пути, вы можете использовать просто POWERSHELL_COMMAND = "powershell" в качестве команды, будьте осторожны, с путями окон с обратной косой чертой, чтобы избежать ошибок, вы можете использовать необработанные строки.

Чтобы убедиться, что у вас есть PowerShell в пути, вы можете перейти к настройкам и проверить, или вы можете просто открыть cmd и набрать powershell, и если это сработает, вы можете предположить, что PowerShell находится в пути.

Из документов :

В Windows с shell = True переменная среды COMSPEC задает оболочку по умолчанию.

То есть set COMSPEC=powershell позволяет shell=True использовать powershell по умолчанию вместо cmd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...