'>'가있는 리디렉션은 쉘에게 생성 된 프로세스의 표준 출력 스트림을 지정하는 방법을 지시하는 쉘 구문입니다. 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%%"
을 추가하여이를 해결할 수 있습니다.
글쎄 그게 ... 고맙습니다, 에릭 손! – user2197005
관련 질문 ... 원래 (즉 diskpart) 명령에 의해 반환 된 오류 코드를 가져 오는 방법이 있습니까? – user2197005
eryksun 고맙습니다 ... 프로세스가 가치가있는 것보다 더 많은 문제를 소리. 나는 그것을 지적하고 필요하다면 아직 시도 할 수있다. – user2197005