使用 '>' 重定向是 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
将引发,它具有returncode
as 属性。
一个更复杂的方法是使用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%%"
.