1

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"が機能するとは思いませんでしたが、他に何をすべきかわかりません。助言がありますか?

ありがとうございました。

4

1 に答える 1

0

'>'を使用したリダイレクトは、作成されたプロセスの標準出力ストリームを指示する方法をシェルに指示するシェル構文です。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%%"

于 2013-03-25T22:23:18.593 に答える