使用Python 3.5执行PowerShell命令

Executing PowerShell commands with Python 3.5

我一直在研究一个需要Python脚本通过PowerShell命令行运行的问题。 该脚本应将命令传递到命令行并保存输出。 但是,我遇到了无法识别某些命令行参数的问题。

1
2
3
4
5
6
7
8
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命令一起使用,则会收到一条错误消息,指出:

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

如果仅使用"dir"行,则脚本可以正常运行。 我在这里为什么会发生这样的说法有分歧。 这不是我正在运行的确切脚本,但是它在我的机器上产生了同样的问题。 如果仅在命令行中输入问题命令,它将按预期输出"Hello world"到新行中。

对于为什么会发生这种情况的任何见解将不胜感激。 如果相关,我不想使用任何类型的管理员特权解决方法。


我相信这是因为在Windows中,默认的Shell不是PowerShell,您可以执行Powershell命令,通过使用所需的参数执行Powershell来调用可执行文件。

例如

1
2
3
4
5
6
7
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"作为命令,并使用反斜杠的Windows路径,以避免错误,可以使用原始字符串。

要验证路径中是否具有Powershell,可以转到配置并进行检查,或者可以打开cmd并键入powershell,如果它可以正常工作,则可以假定Powershell在路径中。

从文档:

On Windows with shell=True, the COMSPEC environment variable specifies the default shell.

因此,set COMSPEC=powershell允许使shell=True使用powershell作为默认值,而不是cmd