Перенаправление с '>' - это синтаксис оболочки, который инструктирует оболочку как направить стандартный выходной поток созданного процесса. 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)
Edit:
Чтобы получить код возврата 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%%"
.
Хорошо, что сработало ... Большое спасибо, eryksun! – user2197005
Связанный вопрос ... Есть ли способ получить код ошибки, возвращенный исходной командой (например, diskpart)? – user2197005
Спасибо, eryksun ... Процесс звучит больше проблем, чем того стоит. Я это заметил и могу попробовать, если понадобится. – user2197005