Что нового

Почему то программа зависате на некоторых компьютерах. Помогите

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Вот такой кусок программы:
Код:
If StringRegExp ($Read, $filer) <> 1 Then

		$filer = FileReadLine ("C:\ftp\updata\upd\updata.txt", $i+1)

		RunWait("C:\ftp\updata\wget.exe -P C:\ftp\updata\upd\ -c http://dragon.permpost.ru/upd/"&$filer)

		RunWait("C:\ftp\updata\upd\"&$filer)
		;-----------------------------
		While 1
			If ProcessExists("cmd.exe") Then
				Sleep (2000)
			Else
				ExitLoop
			EndIf
		WEnd
		;-----------------------------
		Sleep (2000)
		FileDelete("C:\ftp\updata\upd\"&$filer)

	EndIf


Суть в том, что строкой:

RunWait("C:\ftp\updata\upd\"&$filer)

Запускается выполнение обычного батника (cmd). и в цикле смотрится есть ли он в процессах. когда он в процессах закончится, то процесс "проваливается" дальше.
Проблема в том, что ЭТО гоняется у меня на работе на многих компьютерах (около 250 штук), так вот на некоторых (кол-во их невелико) процесс CMD визуально заканчивается, выполняется до конца, но в процессах он висит, и сама программа как бы "зависает".
В чем может быть причина?
Причем на некоторых компьютерах это происходит периодически, а на некоторых - постоянно.
В любом случае видно, что процесс CMD отработался до конца.
Если убить AU3, то процесс CMD - из процессов исчезает.
 
A

Alofa

Гость
ВиталийВВ этот цикл лишний:
Код:
While 1
	If ProcessExists("cmd.exe") Then
		Sleep (2000)
	Else
		ExitLoop
	EndIf
WEnd
Его функции выполняет:
Код:
RunWait("C:\ftp\updata\upd\"&$filer)

Поймите, открытых процессов под названием "cmd.exe" в текущем сеансе ОС может быть много.

"RunWait()" отталкивается не от названия процесса, а от "PID" его экземпляра.
И работает примерно по следующему алгоритму:
Код:
$hPID = Run("C:\ftp\updata\upd\"&$filer)
While ProcessExists($hPID)
	Sleep(250)
WEnd
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
В нашей работе (ну или в текущих задачах, ну или в реальной жизни, зная что и как что делает) могу сказать, что процессов CMD "свободно плавающих" у нас - нет.
Данная программа работает только при старте компьютера (ее суть - обновление ПО).
Изначально тоже понадеялся на что можно ограничиться:
Код:
RunWait("C:\ftp\updata\upd\"&$filer)

идея то красивая, и как только отпустится батник процесс внутрь провалится. Но в реальной жизни процесс проваливался дальше.
По сути
Код:
RunWait("C:\ftp\updata\upd\"&$filer)

есть - саморазварачивающийся архив с последующим его выполнением. Допускаю вариант, что "проваливание" программы ниже происходит как раз после того, как архив развернется, а его выполнение после разварачивания Автоит считает иным процессом.

Именно поэтому пришлось писать вышеприведенный цикл.

Т.е. под: &$filer понимается: саморазворачивающийся и выполняющийся архив.

(Очень надеюсь что смог объяснить)
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
саморазворачивающийся архив (Winrar). После его запуска (в настройках архиватора задается) запускается bat файл.
как вариант - такой:

Код:
@echo off

set s=

echo .
echo .
echo Программа работает!!!!!!!!!!!!!!!!!!!!
echo Ничего пока не трогайте!!!!!!!!!!!!!!
echo .

echo GOOD!!!!!!!!!!!!!!
md "C:\Program Files\loging\loga" >nul
copy c:\1\ncftpput.exe "C:\Program Files\loging\" /y >nul
copy c:\1\user.cfg "C:\Program Files\loging\" /y >nul
echo .

if not exist "C:\Program Files\winpost\lfc.ini" goto no-down

find /i "pointid" < "C:\Program Files\winpost\lfc.ini" > n.txt
for /F "tokens=2,3 delims==. " %%i in (n.txt) do @echo %%i%%j.txt > n2.txt
set /p s=<n2.txt
set "s=%s%"
echo %s%
echo %s%

: -------Зачистка конца ---------------------------
find /v "end-log" < "c:\Program Files\loging\loga\%s%" > "c:\Program Files\loging\loga\2.txt"
copy /y "c:\Program Files\loging\loga\2.txt" "c:\Program Files\loging\loga\%s%"
del "c:\Program Files\loging\loga\2.txt"
: -------Конец зачистки конца ---------------------

:no-down

cd c:\1
echo ============================================ >> "c:\Program Files\loging\loga\%s%"
date /t >> "c:\Program Files\loging\loga\%s%"
time /t >> "c:\Program Files\loging\loga\%s%"
echo ============================================ >> "c:\Program Files\loging\loga\%s%"

tskill winpost
tskill winpostcfg

: -------------------------------------------------------------------------------------------------------------------------------------
rem       Начало обработки программы. Сама суть программы

copy "C:\1\Excel-калькулятор стоимости доставки v2.03.xls" "%USERPROFILE%\Рабочий стол\"
echo calc-v2.03-21-09-2015 >> "c:\Program Files\loging\loga\%s%"

rem       Конец обработки программы. Сама суть программы
: -------------------------------------------------------------------------------------------------------------------------------------

: Чистка лога от пурги---------------
find /v "(Line:" < "c:\Program Files\loging\loga\%s%" > "c:\Program Files\loging\loga\2.txt"
copy /y "c:\Program Files\loging\loga\2.txt" "c:\Program Files\loging\loga\%s%"
del "c:\Program Files\loging\loga\2.txt"

echo .. >> "c:\Program Files\loging\loga\%s%"
echo .. >> "c:\Program Files\loging\loga\%s%"

: ------- Формирование конца ---------------------------

echo end-log >> "c:\Program Files\loging\loga\%s%"

: ------- Конец конца -----------------------------------

rem закачка лога
cd c:\1
call upload.cmd
cd c:\1
del f.txt n.txt n2.txt >nul
:pause
 
A

Alofa

Гость
ВиталийВВ сказал(а):
Суть в том, что строкой:
RunWait("C:\ftp\updata\upd\"&$filer)
Запускается выполнение обычного батника (cmd).
ВиталийВВ сказал(а):
саморазворачивающийся архив (Winrar). После его запуска (в настройках архиватора задается) запускается bat файл.
Заблуждать изволите. И чему из этого верить?

То есть в вашем случае:
Код:
$filer = 'Архив.exe' ; ?


Так или иначе, то что у вас в .bat может сделать скрипт с проверками и т.д.


Добавлено:
Сообщение автоматически объединено:

OffTopic:
И еще...
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
В итоге строку:

If ProcessExists("cmd.exe") Then

Заменил на:

If WinExists ("C:\WINDOWS\system32\cmd.exe") Then

ибо CMD скрипт проходит в активном окне.
Буду тестировать/смотреть, угадал ли.



Добавлено:
Сообщение автоматически объединено:

Alofa сказал(а):
ВиталийВВ сказал(а):
Суть в том, что строкой:
RunWait("C:\ftp\updata\upd\"&$filer)
Запускается выполнение обычного батника (cmd).
ВиталийВВ сказал(а):
саморазворачивающийся архив (Winrar). После его запуска (в настройках архиватора задается) запускается bat файл.
Заблуждать изволите. И чему из этого верить?

То есть в вашем случае:
Код:
$filer = 'Архив.exe' ; ?


То, что обсуждение BAT - офтопик - знаю :smile: привел по просьбе ввиде примера.
Касательно заблуждения - отвечу, что - ничуть, ибо:
Архив.exe - действительно саморазворачивающийся архив.
Но после его разворачивания автоматом (это есть функция архива) запускается/выполняется один из содержавшихся в нем файлов (index.bat) и именно этот BATник отрабатывается некоторое время (сорри за офтоп, но без этого не пояснить).
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В bat файле установите заголовок:
title = #WAIT_WHILE_THIS_DISAPPEAR#
И вместо
Код:
While 1
    If ProcessExists("cmd.exe") Then
        Sleep (2000)
    Else
        ExitLoop
    EndIf
WEnd

Напишите
Код:
WinWait('#WAIT_WHILE_THIS_DISAPPEAR#', '', 20)
WinWaitClose('#WAIT_WHILE_THIS_DISAPPEAR#')
 
A

Alofa

Гость
inververs, я тоже так сначала подумал, что это .bat автора, но потом:
ВиталийВВ сказал(а):
... после его разворачивания автоматом (это есть функция архива) запускается/выполняется один из содержавшихся в нем файлов (index.bat)
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
inververs сказал(а):
В bat файле установите заголовок:
title = #WAIT_WHILE_THIS_DISAPPEAR#
И вместо
Код:
While 1
    If ProcessExists("cmd.exe") Then
        Sleep (2000)
    Else
        ExitLoop
    EndIf
WEnd

Напишите
Код:
WinWait('#WAIT_WHILE_THIS_DISAPPEAR#', '', 20)
WinWaitClose('#WAIT_WHILE_THIS_DISAPPEAR#')

Такой вариант - неудобен, ибо придется перекраивать все батники, которые вполняет AutoIt (дадада, у меня чудовищная солянка из AutoIt'а (как новой-любимой программы :smile: ) и БАТ-файлов, которые в разные моменты делают разные функции).
Перекраивать все и переписывать все модули с БАТ на AutoIt - уж больно нехочется, ибо еще и отлажывать придется.

В настоящее время гоняю в тесте на некольких машинах предложенный мной же самими вариант :smile:.
 
Верх