无法使用python进程执行powershell脚本,但同样适用于cmd行

时间:2018-03-29 19:43:27

标签: python

我有一个PowerShell脚本,我试图通过python子进程执行。我使用从子进程导入的check_output用于其他cmd行进程,因此我将它用于powershell脚本。在我的powershell脚本中,我加载了一些第三方模块,然后从这些模块执行cmdlet。这是我的python代码..

from subprocess import Popen, STDOUT, check_output

cmd = 'C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe -nologo -file c:\\test.ps1'
            cmd_output = check_output(cmd, stderr=STDOUT)
            output = cmd_output.decode("utf-8").split('\n')

当python代码运行时,我需要一些时间来假设它通过powershell ps1脚本中的代码加载模块,但是我得到一个错误,我在我的powershell脚本中引用的cmdlet是"不被识别为cmdlet"的名称,当模块没有在powershell脚本中正确加载时发生,所以我不认为我的模块正在加载这很奇怪。我也注意到当ps1脚本通过python加载它运行大约10秒然后返回,如果我从命令行手动运行ps1脚本(见下文),通常需要60秒才能在ps1脚本中加载模块。 / p>

我还尝试了另一种子进程的方法,而不是check_output,见下文,没有差异

cmd = Popen(['powershell.exe', '-nologo', '-file', 'c:\\test.ps1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

但我可以打开一个cmd窗口并使用

手动完成它
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -nologo -file C:\test\test.ps1

应该和我已经在python中做的一样:(所以我不知道为什么它不在python中工作?

我的执行政策如下

PS C:\> Get-ExecutionPolicy -list

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    Unrestricted
 LocalMachine    Unrestricted

1 个答案:

答案 0 :(得分:2)

尝试使用不受限制的ExecutionPolicy参数:

# python 2.7 and 3.4
import subprocess
fname = "C:\\Demo\\test.ps1"
p = subprocess.Popen(["powershell", "-ExecutionPolicy", "unrestricted", "-nologo", "-file", "%s"%(fname)], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode == 0:  
  print("buffer :")
  print(out)
else:
  print("error  :")
  print(err)

'C:\ Demo \ test.ps1'

的内容
write-host $env:USERPROFILE;
Get-ExecutionPolicy -list;
try{
    Get-Module -Name VMware.VimAutomation.Core -ListAvailable | Import-Module;
    write-host 'ok import VMware';
}catch{
    write-host 'error import VMware';
    write-host $_;
}

脚本执行后的输出(注意Process策略)

buffer :
C:\Users\MyUserName
ok import VMware
        Scope ExecutionPolicy
        ----- ---------------
       ...       ...
       ...       ...
       Process    Unrestricted
       ...       ...
       ...       ...

在system32上,模块路径在这里: C:\窗口\ system32 \ WindowsPowerShell \ V1.0 \

尝试使用:

p = subprocess.Popen(["powershell", "-ExecutionPolicy", "unrestricted", "-nologo", "-command", "&{ Get-Module –ListAvailable }"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

显示所有可用模块