'>'を使用したリダイレクトは、作成されたプロセスの標準出力ストリームを指示する方法をシェルに指示するシェル構文です。diskpartはそれを理解していません。COMSPEC
'/ c'オプションを使用して、シェル(何でも)を介してコマンドを実行できます。これは機能するはずです:
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()
昇格された特権を確認します。プロセスが昇格されている場合は、。を指定してdiskpartを実行しoutput = subprocess.check_output(r'diskpart /s C:\TEMP\mapRHD.dp')
ます。必要に応じて、出力を後処理してログに記録できます。
コマンドの実行に失敗した場合は、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
キーが返すdictからのキー(プロセスハンドル)の値が必要です。
次に、を使用win32event.WaitForSingleObject
してプロセスが閉じるのを待ちます。無期限に待つには、を使用しますwin32event.INFINITE
。最後に、呼び出しwin32process.GetExitCodeProcess
て終了コードを取得します。現状では、シェルを介して実行すると、このコードは0(成功)または1(失敗)のいずれかになると思いますが、。を追加することで回避できる可能性がありますcommand += " & exit /b %%errorlevel%%"
。