Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Причина в другом.
Программирование на CMD - это как работа с бомбой, никогда не знаешь когда взорвется, а когда взорвется уже не поймешь почему.
Это я к тому, что там нет в помине никаких try...catch. Любая ошибка, среда "падает". Нужна предельная внимательность.
И я здесь вредных советов не давал. У меня было реализовано гораздо проще, т.о. не безопасно,
что и потвердили наши с glax24-ом последние тесты, где WMI нафиг валила среду AutoIT (но опять таки у него не отдельным потоком реализация).
Но Drongo, ты же вроде матерый программист, должен понимать, что запустив в другом потоке (процессе), это не приведет к падению AVZ.
В основном коде ставится таймер Deadlin-а (WatchDog по-Вашему) + условие. Продолжить код, если выполнено одно из условий:
1) или получен код возврата WMIC (через файл... или как душа придумает AVZ умеет)
2) или закончился таймер дедлайна.
Как я завалил WMIC: тут нельзя -> напишу в закрытом разделе.
Кто мешает сейчас решить эту проблему. Я так понимаю конкуренции уже нет?
Я готов помочь и из интереса посмотреть на среду, где была проблема, и дать пару команд для проверки твоего утверждения.
Если в начале темы, ту ошибку давно исправил (но это было еще в ver.0.1.9.0)
Проблема была, что код ошибки оказался со знаком - (минус), чего я не ожидал.
p/s
1) средствами AVZ работа с WMI отдельным потоком не получится.
2) WatchDog будет работать до конца пока не истечёт его таймер ни на какое условие не отреагирует.
pps/ лично у меня нет желания тратить кучу времени на написания процедуры, только для того чтобы доказать что она будет косячить.
Я говорил образно. Конечно, придется писать свой. У меня такой был только один. Он отвечает за запуск RSIT и написан на VBS (JS в первой версии).
Вообщем провел несколько креш-тестов по WMIC.
Получил и славный код успеха при поврежденном WMIC.
Т.о. наиболее надежно можно получить результат успеха, анализируя сам вывод команды WMIC:
Код:
WMIC /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint "SafeZone.cc", 100, 10
Идет выполнение (SystemRestore)->CreateRestorePoint()
Метод успешно вызван.
Параметры вывода:
instance of __PARAMETERS
{
ReturnValue = 0;
};
На счет "Включить создание контрольных точек" спомощью WMIC - не рекомендую такое делать на XP.
В остальных случаях никаких зависаний в теме о лечении я не наблюдал.
UPD... открыл справку по ExecuteFile и прикололся. Там и пауза, и Terminate уже все реализовано,
позже сделаю, чтоб WMIC вообще "замерзла", посмотрим, как справится эта функция.
А пока реализация в отдельном процессе вне AVZ:
Код:
// Вычисляем кол-во процессов
Function GetProcessCountByName(name : string) : integer;
var
i : integer;
count : integer;
begin
// Обновить список процессов
RefreshProcessList;
count := 0;
// Цикл по списку процессов
for i := 0 to GetProcessCount - 1 do begin
if LowerCase(GetProcessName(i)) = name then count := count + 1;
end;
Result := count;
end;
// Прошло ли указанное кол-во секунд (допустимо указывать не > 60)
Function IsElapsedSeconds(LastDate : TDateTime; CurrentDate : TDateTime; SecMax : integer) : Boolean;
var
LastSec, CurSec, Diff : integer;
begin
LastSec := StrToInt(FormatDateTime('ss', LastDate));
CurSec := StrToInt(FormatDateTime('ss', CurrentDate));
Diff := CurSec - LastSec;
if (Diff < 0) then Diff := Diff + 60;
Result := (Diff > SecMax);
end;
// Создать System Recovery Point. Возвращает true в случае успеха.
Function CreateSR : Boolean;
var
W_log, SR_Command : String;
//SL : TStringList;
WmicCount : integer;
LastDate : TDateTime;
begin
// Папка с логом SR
W_log := GetAVZDirectory + '\WMIC.log';
if FileExists(W_log) then DeleteFile(W_log);
// Команда создания SR средствами WMIC
SR_Command := 'WMIC /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint "SafeZone.cc", 100, 10';
// Считаем кол-во процессов WMIC перед его запуском
WmicCount := GetProcessCountByName('wmic.exe');
// Запуск SR через CMD без ожидания завершения операции с логированием вывода в файл W_log, в свернутом окне
ExecuteFile('cmd.exe', '/c start /min "" cmd /c "' + SR_Command + ' > ' + '"' + W_log + '""', 2, 0, false);
// Выжидаем среднее приемлемое время
Sleep(3);
LastDate := now;
// Цикл - своеобразный WatchDog: завершится, если или пройдет граничное время (еще 10 сек.), или кол-во процессов WMIC уменьшится на 1
while (GetProcessCountByName('wmic.exe') > WmicCount) and (not IsElapsedSeconds(LastDate, now, 12)) do begin
Sleep(1);
end;
Sleep(2);
if FileExists(W_log) then begin
// Загрузка из текстового файла (закомментировал - вызывает падение AVZ)
//SL.LoadFromFile(W_log);
//Result := (SL.IndexOf(#9+'ReturnValue = 0;') <> -1);
LoadFileToBuffer(W_log);
// Проверка наличия сигнатуры "ReturnValue = 0;"
Result := (SearchSign('52 65 74 75 72 6E 56 61 6C 75 65 20 3D 20 30 3B',0,0) >= 0);
// Чистим буфер
FreeBuffer;
DeleteFile(W_log);
end
else begin
// Если команда "замерзла", завершаем WMIC принудительно
TerminateProcessByName('wmic.exe');
Result := false;
end;
end;
var
msg : string;
begin
if CreateSR then
msg := 'Контрольная точка успешно создана.'
else
msg := 'Не удалось создать контрольную точку восстановления системы !!!';
MessageDLG(msg, mtInformation, mbOk, 0);
end.
Но кому я это рассказіваю. Все равно никто не слушает.
... У Вас тут кто-то учит писать простые скрипты, а то у меня не получается?
Как я понял в автологере нет проверок актуальности программ входящих в его состав, http://forum.oszone.net/thread-274039.html
Например SITLog 0.7.7 хотя сейчас актуальная 0.7.25
+ Почему то RSIT запущенный отдельно отработал, а в сборке дал ошибку.
Саня ты читаешь сообщение (специально же ссылку дал), вот именно версиия 0.7.25 , если ты перейдешь по ссылке и посмотришь вчерашние логи то в них версия SITLog 0.7.7. Отсюда вопрос что в Автологере нет проверок актуальности программ?
В автологере нет необходимости делать проверку актуальности версии. На момент скачивания у юзера всегда актуальная версия.
Мы решили отказаться от проверки непосредственно во время выполнения логов, т.к. возможно у юзера будет загруженый инет, возможно его не будет вообще. Но в архиве автологгера и на сервере всегда версия актуальна, т.к. обновление происходит раз в сутки.
А если юзер скачал автологер месяц назад и делает им логи, может тогда хотя бы в инструкции упомянуть что необходимо заново скачать автологер.
А с RSIT что? или автологер здесь не причем?
имхо, лишнее. Имхо, критична версия и обновления баз AVZ - их проверка встроена в автологер, а версия SITLog думаю не так критична, если там будет (или не будет) что-то важное по мнению консультанта, то он может попросить скачать свежую версию AutoLogger.
+ своё, имхо, по поводу добавления этой утилиты я писал в теме.Не смотря на то, что логи собираются автоматом нет смысла постоянно собирать двадцать логов, если они не нужны.