使用 '>' 重定向是 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_NOCLOSEPROCESS、nShow = 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%%".