【问题标题】:elevated diskpart output提升的磁盘部分输出
【发布时间】:2013-03-25 21:08:56
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: winapi python-3.x runas


    【解决方案1】:

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

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

    【讨论】:

    • 一个相关的问题...有什么办法可以得到原始(即diskpart)命令返回的错误码?
    • 谢谢 eryksun... 这个过程听起来比它的价值更麻烦。我已经注意到了,如果我需要它可能会尝试它。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2011-09-04
    相关资源
    最近更新 更多