1

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

谢谢你。

4

1 回答 1

0

使用 '>' 重定向是 shell 语法,它指示 shell 如何引导已创建进程的标准输出流。diskpart 不明白。COMSPEC您可以使用 '/c' 选项通过 shell(无论是什么)运行命令。这应该有效:

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'). 您可以根据需要对输出进行后处理和记录。

如果命令执行失败,OSError则会引发 an。如果 diskpart 因错误退出,subprocess.CalledProcessError将引发,它具有returncodeas 属性。

一个更复杂的方法是使用win32com.shell.shell.ShellExecuteEx,它返回一个新进程的句柄。按关键字、设置fmask = win32com.shell.shellcon.SEE_MASK_NOCLOSEPROCESSnShow = win32con.SW_SHOWNORMAL(或您需要的任何显示级别)lpVerb = 'runas'、、、lpFile = os.environ['COMSPEC']lpParameters = command。您需要hProcess它返回的 dict 中的键值(进程句柄)。

然后使用win32event.WaitForSingleObject等待进程关闭。无限期地等待使用win32event.INFINITE. 最后,调用win32process.GetExitCodeProcess以获取退出代码。照原样,我认为通过 shell 运行意味着此代码将是 0(成功)或 1(失败),但您可以通过附加command += " & exit /b %%errorlevel%%".

于 2013-03-25T22:23:18.593 回答