首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提升的diskpart输出

提升的diskpart输出
EN

Stack Overflow用户
提问于 2013-03-26 05:08:57
回答 1查看 1.1K关注 0票数 1

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 06:23:19

带'>‘的重定向是shell语法,它指示shell如何定向所创建进程的标准输出流。diskpart不理解它。您可以通过shell (无论COMSPEC是什么)和'/c‘选项运行该命令。这应该是可行的:

代码语言:javascript
复制
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%%"来解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15624804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档