提升的diskpart输出

时间:2013-03-25 21:08:57

标签: winapi python-3.x runas

我需要在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”可以在这里工作,但我不知道还能做什么。有什么建议吗?

谢谢。

1 个答案:

答案 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_NOCLOSEPROCESSnShow = 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%%"来解决这个问题。