我需要在Windows7下的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“可以在这里工作,但我不知道还能做什么。有什么建议吗?
谢谢。
发布于 2013-03-26 06:23:19
带'>‘的重定向是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%%"来解决这个问题。
https://stackoverflow.com/questions/15624804
复制相似问题