2013-03-25 3 views
1

Windows 7에서 내 python3 스크립트에서 diskpart를 실행하고 출력을 캡처해야합니다. 스크립트를 높은 모드로 실행합니다. 그것은 실행되지만 출력을 캡처 할 수 없으므로 성공했는지 확인할 수 없습니다.높은 diskpart 출력

win32api.ShellExecute (0 RUNAS, DISKPART,/s의 C : \의 TEMP \ mapRHD.dp> C : \ 임시 \의 diskpart.out, C : \ Python3 1)

여기에 해당 호출의 C : \ TEMP \ diskpart.out 파일이 작성되지 않습니다.

리다이렉션 "C : \ TEMP \ diskpart.out"이 여기에서 작동한다고 생각하지는 않지만 그 밖의 다른 작업은 무엇인지 알지 못합니다. 어떤 제안?

감사합니다.

답변

0

'>'가있는 리디렉션은 쉘에게 생성 된 프로세스의 표준 출력 스트림을 지정하는 방법을 지시하는 쉘 구문입니다. diskpart가 이해하지 못합니다. '/ c'옵션을 사용하여 셸 (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을 설정하십시오. 반환하는 dict에서 hProcess 키 (프로세스 핸들)의 값이 필요합니다.

그런 다음 win32event.WaitForSingleObject을 사용하여 프로세스가 닫힐 때까지 기다리십시오. 무기한 대기하려면 win32event.INFINITE을 사용하십시오. 마지막으로 win32process.GetExitCodeProcess으로 전화하여 종료 코드를 받으십시오. 마찬가지로, 나는이 코드가 0 (성공) 또는 1 (실패)이 될 것이라는 것을 쉘을 통해 실행하는 것이 좋다고 생각하지만, 아마도 command += " & exit /b %%errorlevel%%"을 추가하여이를 해결할 수 있습니다.

+0

글쎄 그게 ... 고맙습니다, 에릭 손! – user2197005

+0

관련 질문 ... 원래 (즉 diskpart) 명령에 의해 반환 된 오류 코드를 가져 오는 방법이 있습니까? – user2197005

+0

eryksun 고맙습니다 ... 프로세스가 가치가있는 것보다 더 많은 문제를 소리. 나는 그것을 지적하고 필요하다면 아직 시도 할 수있다. – user2197005