Что нового

Вывод ошибок от утилит PSTools

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Хочу сделать скрипт, который будет удаленно запускать службы или устанавливать их.
Идея такая:
Код:
RunWait("psservice.exe $Host -u $Login -p $Pass  query wuauserv")

Работает, но не знаю, как отлавливать ошибки. Т.е. если служба не найдена, то выполнить код для ее установки.
Код для установки аналогичный, но с использованием PSexec. И там так же нужно будет каким-то образом получать вывод. Т.е. успешно-ли установилось.

Данный вариант ничего не выводит:

Код:
#include <Constants.au3>

Local $iPID = RunWait("psservice.exe $Host -u $Login -p $Pass  query wuauserv")
Local $sOutput
While 1
    $sOutput = StdoutRead($iPID)
    If @error Then ; Выход из цикла, если процесс завершён или StdoutRead возвращает ошибку.
        ExitLoop
    EndIf
    MsgBox(4096, "Stdout прочитано:", $sOutput)
WEnd

While 1
    $sOutput = StderrRead($iPID)
    If @error Then ; Выход из цикла, если процесс завершён или StdoutRead возвращает ошибку.
        ExitLoop
    EndIf
    MsgBox(4096, "Stderr прочитано:", $sOutput)
WEnd


Спасибо.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$s_Read = ''
$i_PID = RunWait("psservice.exe $Host -u $Login -p $Pass  query wuauserv", '', @SW_HIDE, 8)
While 1
	$s_Read &= StdoutRead($i_PID)
	If @error Then ExitLoop
	Sleep(1)
WEnd
MsgBox(32,'',$s_Read)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Tuxzer92
RunWait не возвращает PID
 
Автор
T

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Может есть все таки способ для отслеживания выполнения команды на удаленном ПК?
Просто я выполняю команды на удаленном ПК и не знаю какие произошли ошибки во время выполнения.
Пока есть такой вариант:
Код:
$Host="\\pc"
$Login="Администратор"
$Pass="pass"
$s_Read = ''

$Script=@ScriptDir & "\1.bat"
;MsgBox(0,"",$Script)

;MsgBox(0,"","psexec.exe -c -f " & $Host & " -u " & $Login & " -p " & $Pass &" "& $Script)
$i_PID=RunWait("psexec.exe -c -f " & $Host & " -u " & $Login & " -p " & $Pass &" "& $Script)

While 1
    $s_Read &= StderrRead($i_PID)
    If @error Then ExitLoop
    Sleep(1)
WEnd
MsgBox(32,'',$s_Read)


Содержимое 1.bat:

Код:
sc query wuauserv
if %errorlevel% EQU 0 (sc query wuauserv | findstr STATE.*RUNNING) else (net start wuauserv)
Может я что-то не так делаю?

В итоге хочу сделать проверку наличия нужной службы на удаленном ПК и если она есть, то запустить ее, а если ее нет, то установить.
Но не получается отлавливать код работы psexec, чтобы узнать о наличии службы на удаленном ПК.
 
A

Alofa

Гость
Утилиты пакета PStools являются консольными приложениями. Что сие значит? Правильно, все отчеты о выполнении той или иной утилиты будут выведены в консоль. А это что..? Правильно, нужно просто перехватить эти самые отчеты, а что в Autoit отвечает за это? Правильно...
Код:
Local $sOutput, $iPID = Run('.\PSTools\psservice.exe \\Компьютер', '', @SW_HIDE, $STDERR_CHILD)
ProcessWaitClose($iPID)
$sOutput = StderrRead($iPID)
MsgBox(262144, Default, 'Stderr прочитано:' & @LF & $sOutput)


А теперь ответьте, почему RunWait() не подходит для таких целей?
 
Автор
T

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Все работает. Вывод получаю. Чтобы не создавать новую тему, скажите пожалуйста, а как вместо всего этого вывода выводить только одну цифру?
Т.е. если все хорошо, то 0, иначе 1?
 
Автор
T

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Если будет ошибка, то она выведется. С одним кодом, а если нет ошибки, то с другим, но вывод есть в любом случае
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Tuxzer92
StringInStr по ключевому слову/строке которое меняется в зависимости от успеха/ошибки
 
Верх