使用'>'重定向是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_NOCLOSEPROCESS
,nShow = 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%%"
來解決這個問題。
那麼工作...非常感謝你,eryksun! – user2197005 2013-03-25 23:35:43
相關的問題......有什麼辦法可以得到原始(即diskpart)命令返回的錯誤代碼? – user2197005 2013-03-26 00:03:17
謝謝eryksun ...這個過程聽起來比它值得的更麻煩。我已經注意到它,如果我需要它可能會嘗試它。 – user2197005 2013-03-26 16:22:59