【发布时间】:2018-04-16 02:14:24
【问题描述】:
之前关于该主题的所有帖子都针对其用例处理特定挑战。我认为有一个帖子只处理从 Python 运行 PowerShell 脚本的最干净的方法并询问是否有人有比我发现的更好的解决方案会很有用。
似乎普遍接受的解决方案是绕过 PowerShell 尝试以不同方式解释命令中的不同控制字符,以使用文件来提供 Powershell 命令:
ps = 'powershell.exe -noprofile'
pscommand = 'Invoke-Command -ComputerName serverx -ScriptBlock {cmd.exe \
/c "dir /b C:\}'
psfile = open(pscmdfile.ps1, 'w')
psfile.write(pscommand)
psfile.close()
full_command_string = ps + ' pscmdfile.ps1'
process = subprocess.Popen(full_command_string , shell=True, \
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
当您的 python 代码需要在每次调用 Powershell 命令时更改其参数时,您最终会编写和删除大量临时文件以供 subprocess.Popen 运行。它工作得很好,但它是不必要的而且不是很干净。能够整理并希望获得有关我可以对找到的解决方案进行的任何改进的建议真是太好了。
使用 io 模块创建一个虚拟文件,而不是将包含 PS 命令的文件写入磁盘。假设“日期”和“服务器”字符串作为包含此代码的循环或函数的一部分被输入,当然不包括导入:
import subprocess
import io
from string import Template
raw_shellcmd = 'powershell.exe -noprofile '
--填充了服务器和日期变量的循环开始--
raw_pslistcmd = r'Invoke-Command -ComputerName $server -ScriptBlock ' \
r'{cmd.exe /c "dir /b C:\folder\$date"}'
pslistcmd_template = Template(raw_pslistcmd)
pslistcmd = pslistcmd_template.substitute(server=server, date=date)
virtualfilepslistcommand = io.BytesIO(pslistcmd)
shellcmd = raw_shellcmd + virtualfilepslistcommand.read()
process = subprocess.Popen(shellcmd, shell=True, stdout=subprocess.PIPE, \
stderr=subprocess.PIPE)
--循环结束--
【问题讨论】:
标签: python python-2.7 powershell