2013-03-25 25 views
1

我需要在Windows 7下運行我的python3腳本中的diskpart並捕獲它的輸出。我在提升模式下運行腳本;它運行但我無法捕獲輸出,因此無法確定它是否成功。下面是它的調用:提升的diskpart輸出

win32api.ShellExecute(0,運行方式,DISKPART,/秒C:\ TEMP \ mapRHD.dp> C:\ TEMP \ diskpart.out,C:\ Python3,1)

的C:\ TEMP \ diskpart.out文件不會被寫入。

我真的不認爲重定向「> C:\ TEMP \ diskpart.out」可以在這裏工作,但我不知道該怎麼辦。有什麼建議麼?

謝謝。

回答

0

使用'>'重定向是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%%"來解決這個問題。

+0

那麼工作...非常感謝你,eryksun! – user2197005 2013-03-25 23:35:43

+0

相關的問題......有什麼辦法可以得到原始(即diskpart)命令返回的錯誤代碼? – user2197005 2013-03-26 00:03:17

+0

謝謝eryksun ...這個過程聽起來比它值得的更麻煩。我已經注意到它,如果我需要它可能會嘗試它。 – user2197005 2013-03-26 16:22:59