2013-03-25 2 views
1

Мне нужно запустить diskpart в моем сценарии python3 под Windows 7 и записать его вывод. Я запускаю сценарий в повышенном режиме; он работает, но я не могу зафиксировать вывод и, следовательно, не могу определить, было ли оно успешным. Вот его призывание:повышенный выход diskpart

win32api.ShellExecute (0, руны, DiskPart,/s C: \ TEMP \ mapRHD.dp> C: \ TEMP \ diskpart.out, C: \ Python3, 1)

Файл C: \ TEMP \ diskpart.out не записывается.

Я действительно не думал, что перенаправление «> C: \ TEMP \ diskpart.out» будет работать здесь, но я не знаю, что еще делать. Какие-либо предложения?

спасибо.

ответ

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) 

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%%".

+0

Хорошо, что сработало ... Большое спасибо, eryksun! – user2197005

+0

Связанный вопрос ... Есть ли способ получить код ошибки, возвращенный исходной командой (например, diskpart)? – user2197005

+0

Спасибо, eryksun ... Процесс звучит больше проблем, чем того стоит. Я это заметил и могу попробовать, если понадобится. – user2197005