我需要在Windows 7下的python3脚本中运行diskpart并捕获其输出。我以提升模式运行脚本;它运行但我无法捕获输出,因此无法确定它是否成功。这是它的调用:
win32api.ShellExecute(0,runas,diskpart,/ s C:\ TEMP \ mapRHD.dp> C:\ TEMP \ diskpart.out,C:\ Python3,1)
C:\ TEMP \ diskpart.out文件未写入。
我真的不认为重定向“> C:\ TEMP \ diskpart.out”可以在这里工作,但我不知道还能做什么。有什么建议吗?
谢谢。
答案 0 :(得分:0)
使用'>'进行重定向是shell语法,它指示shell如何指向所创建进程的标准输出流。 diskpart不明白。您可以通过shell运行命令(无论COMSPEC
是什么)和'/ c'选项。这应该有效:
import os
import win32api
shell = os.environ['COMSPEC'] # e.g. cmd.exe
command = r'/c diskpart /s C:\TEMP\mapRHD.dp > C:\TEMP\diskpart.out'
win32api.ShellExecute(0, 'runas', shell, command, '', 1)
修改强>
要从diskpart获取返回代码,可以更简单地将脚本作为提升的进程重新启动,如上所述。脚本名称位于__file__
,并运行sys.executable
。一开始,请检查win32com.shell.shell.IsUserAnAdmin()
以获取提升的权限。如果进程提升,请使用output = subprocess.check_output(r'diskpart /s C:\TEMP\mapRHD.dp')
运行diskpart。您可以根据需要对输出进行后处理和记录。
如果命令执行失败,则会引发OSError
。如果diskpart退出时出现错误,则会引发subprocess.CalledProcessError
,其中returncode
为属性。
更复杂的方法是使用win32com.shell.shell.ShellExecuteEx
,它返回新进程的句柄。按关键字,设置fmask = win32com.shell.shellcon.SEE_MASK_NOCLOSEPROCESS
,nShow = win32con.SW_SHOWNORMAL
(或您需要的任何展示级别),lpVerb = 'runas'
,lpFile = os.environ['COMSPEC']
和lpParameters = command
。您需要从它返回的字典中获取hProcess
键(进程句柄)的值。
然后使用win32event.WaitForSingleObject
等待进程关闭。无限期等待使用win32event.INFINITE
。最后,请致电win32process.GetExitCodeProcess
以获取退出代码。因此,我认为通过shell运行意味着此代码将为0(成功)或1(失败),但您可以通过附加command += " & exit /b %%errorlevel%%"
来解决这个问题。