Что нового

Как сделать последовательное выполнение действий в теле If...Then...

irchik

Новичок
Сообщения
4
Репутация
0
Как можно выполнить пошаговое/последовательное (обозначено в коде в комментариях шагами) выполнение действий в теле If...Then...? какие условия нужно или можно назначить? а может и вообще другую конструкцию надо использовать? это мое первое знакомство с AutoIt - не могу придумать как выполнить шаг, и только при его выполнении начинать выполнение следующего. в моей программе выполнение проиходит параллельно - запускаются сразу все функции, а нужно последовательно.
Суть программы такая - Проверить наличие обновления SBP. если не установлено - последовательно удалить при наличии SP3, SP2, установить SBP, SP2, SP3, SP4. При установленном SBP установить SP4.

Код:
if $varSBP = "" Then ;SBP не установлен
	
	;шаг 1
	;Проверка наличия SP3 и в случае его наличия - удаление
	If $varSP3 <> "" Then ;SP3 установлен
	Uninstall_SP3($varSP3)	;удалить SP3
    EndIf
    
	;шаг 2
	;Проверка наличия SP2 и в случае его наличия - удаление
    if $varSP2 <> "" Then ;SP2 установлен
	Uninstall_SP2($varSP2)	;удалить SP2
	EndIf
    ;шаг 3
	Install_SBP($varSBP) ;установка SBP
	;шаг 4
	Install_SP2($varSP2) ;установка SP2
	;шаг 5
	Install_SP3($varSP3) ;установка SP3
	;шаг 6
	Install_SP4($varSP4) ;установка SP4
	
Else ;SBP установлен
	Install_SP4($varSP4) ;установка SP4
EndIf
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
irchik [?]
в моей программе выполнение проиходит параллельно - запускаются сразу все функции, а нужно последовательно.
А Вы пример приведите Ваших функций.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
irchik
каждый следующий шаг должен быть оформлен в виде вложенной конструкции. то есть, формально
Код:
If $some_clause Then
    ; Do something
    If $sub_clause1 Then
        ; Do another thing
        If $subsub_clause Then
            ; Do last thing
        EndIf
    EndIf
EndIf

то есть выполнять последующие шаги только при успехе предыдущих, например проверок флагов установленного софта
 
Автор
I

irchik

Новичок
Сообщения
4
Репутация
0
madmasles [?]
Вы пример приведите Ваших функций.

Вот пример моих функций. Все работают как надо.

Код:
func Uninstall_SP3($varSP3)	
	 Run("Msiexec.exe /uninstall {702F2425-1400-3000-0032-F0408A8E25CA} /package {7F4DD591-1400-0409-0000-7107D70F3DB4} /qb")
    WinWaitClose("Autodesk Inventor Professional 2010")   
    EndFunc

Func Install_SP3($varSP3)
	 ShellExecute("\\telit-9\Inventor\SP\inventor2010_sub_advantagepack_sp3_x86.msp")   
   WinWaitActive("Autodesk Inventor Professional 2010 Уст-ка", "&Next >")
   ControlClick("Autodesk Inventor Professional 2010 Уст-ка","Welcome to the Autodesk Inventor Professional 2010 Patch Wizard","&Next >")
   WinWaitActive("Autodesk Inventor Professional 2010 Уст-ка","Autodesk Inventor Professional 2010 has been successfully installed.")
   ControlClick("Autodesk Inventor Professional 2010 Уст-ка","Autodesk Inventor Professional 2010 has been successfully installed.","&Finish" )
   EndFunc




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

Kaster [?]
каждый следующий шаг должен быть оформлен в виде вложенной конструкции. то есть, формально
Код: AutoIt [Выделить]
If $some_clause Then
; Do something
If $sub_clause1 Then
; Do another thing
If $subsub_clause Then
; Do last thing
EndIf
EndIf
EndIf
то есть выполнять последующие шаги только при успехе предыдущих, например проверок флагов установленного софта

к сожалению, так уже пробовала раньше и так тоже не работает. он начинает выполнение "Do something" и сразу же следующий If, не дожидаясь завершения процесса "Do something". т.е. установка флагов или условий завершения процесса "Do something" тут не помогает.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
irchik [?]
установка флагов или условий завершения процесса "Do something" тут не помогает.


Функция должна содержать информацию о ее завершении процесса инсталяции-деинсталяции

Т.е.
Код:
$iProc=Do_something1("aaa")

If $iProc=1 Then 
   $iProc= Do_something("bbb")
EndIf

Func Do_something($sVar)
    ;....................
    ;If @error Then Return 0
    Return 1
EndFunc




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

Вот подробный макет действий по указанному тобой сценарию :
Код:
; Вариант 1 : SBP установлен
Global $varSBP=1, $varSP2, $varSP3, $varSP4

; Вариант 2 : SBP неустановлен
Global $varSBP=0, $varSP2=1, $varSP3=1, $varSP4


If $varSBP Then ;SBP установлен
    $iAnswer=MsgBox(32+3, "Вопрос", "SBP установлен." & "Установить SP4 ?", 3)
    If  $iAnswer=2 Then 
        Exit
    ElseIf $iAnswer<>7 Then 
        $iProc=Install($varSP4) ;установка SP4
        GetInfo("SP4", $iProc)
    EndIf
Else ;SBP не установлен
    If $varSP3 Then
        $iAnswer=MsgBox(32+3, "Вопрос", "SBP установлен." & @CRLF & "SP3 установлен." & "Деинсталировать SP3 ?", 3)
        If  $iAnswer=2 Then 
            Exit
        ElseIf $iAnswer<>7  Then 
            $iProc= Uninstall($varSP3)
            GetInfo1("SP3", $iProc)
        EndIf
    EndIf
   $iAnswer=MsgBox(32+3, "Вопрос", "Установить SP3 ?", 3)
    If  $iAnswer=2 Then 
        Exit
    ElseIf $iAnswer<>7  Then 
        $iProc= Install($varSP3)
        GetInfo("SP3", $iProc)
    EndIf
    if  $varSP2 Then 
        $iAnswer=MsgBox(32+3, "Вопрос", "SP2 установлен." & "Деинсталировать SP2 ?", 3)
        If  $iAnswer=2 Then 
            Exit
        ElseIf   $iAnswer<>7  Then 
            $iProc= Uninstall($varSP2)
            GetInfo1("SP2", $iProc)
        EndIf
    EndIf
    $iAnswer=MsgBox(32+3, "Вопрос", "Установить SP2 ?", 3)
    If  $iAnswer=2 Then 
        Exit
    ElseIf  $iAnswer<>7  Then 
        $iProc= Install($varSP2)
        GetInfo("SP2", $iProc)
    EndIf
    $iAnswer=MsgBox(32+3, "Вопрос", "Установить SP4 ?", 3)
    If  $iAnswer=2 Then 
        Exit
    ElseIf   $iAnswer<>7  Then 
        $iProc= Install($varSP4)
        GetInfo("SP4", $iProc)
    EndIf
    $iAnswer=MsgBox(32+3, "Вопрос", "Установить SBP ?", 3)
    If  $iAnswer=2 Then 
        Exit
    ElseIf  $iAnswer<>7  Then 
        $iProc= Install($varSBP)
        GetInfo("SBP", $iProc)
    EndIf
EndIf

MsgBox(64, "Инфо", " Все операции выполнены успешно")

Func GetInfo($sProg, $iProcess)
    If $iProcess Then 
        MsgBox(64, "Инфо", $sProg & " - Установлена успешно", 3)
    Else
        MsgBox(16, "Стоп", "Ошибка при инсталяции " & $sProg)
        Exit
    EndIf
EndFunc

Func GetInfo1($sProg, $iProcess)
    If $iProcess Then 
        MsgBox(64, "Инфо","Деинсталяция " & $sProg & " - выполнена успешно", 3)
    Else
        MsgBox(16, "Стоп", "Ошибка при деинсталяции " & $sProg, 3)
        Exit
    EndIf
EndFunc

Func Install($sVar)
    ;...........................
   ; If @error Then Return 0
    
    Return 1
EndFunc

Func Uninstall($sVar)
    ;...........................
    If @error Then Return 0
    
    Return 1
EndFunc



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

Возможно следует добавить ожидание закрытия окна в ф-ии
Код:
Func Install_SP3($varSP3)
     ShellExecute("\\telit-9\Inventor\SP\inventor2010_sub_advantagepack_sp3_x86.msp")   
  ;........................
   ControlClick("Autodesk Inventor Professional 2010 Уст-ка","Autodesk Inventor Professional 2010 has been successfully installed.","&Finish" )
  Return  WinWaitClose("Autodesk Inventor Professional 2010 Уст-ка"); **************
EndFunc
 
Автор
I

irchik

Новичок
Сообщения
4
Репутация
0
gregaz [?]
Вот подробный макет действий по указанному тобой сценарию
выполнила по макету - суть та же. начинается удаление SP3 и сразу, не дожидаясь конца процесса начинается его же установка
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
irchik [?]
начинается удаление SP3 и сразу, не дожидаясь конца процесса начинается его же установка
Попробуйте поменять
Код:
;...
Run("Msiexec.exe /uninstall {702F2425-1400-3000-0032-F0408A8E25CA} /package {7F4DD591-1400-0409-0000-7107D70F3DB4} /qb")
;на
RunWait("Msiexec.exe /uninstall {702F2425-1400-3000-0032-F0408A8E25CA} /package {7F4DD591-1400-0409-0000-7107D70F3DB4} /qb")
;...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
irchik [?]
выполнила по макету - суть та же. начинается удаление SP3 и сразу, не дожидаясь конца процесса начинается его же установка

Это подтверждает то, что проблема не в организации циклов, а в организации выявления завершения процессов в самих функциях.

Ведь имеющаяся :
Код:
 WinWaitClose("Autodesk Inventor Professional 2010")
и при отсутствии (непоявления) окна сразу выдаст 1 и пойдет следующий процесс

Действительно необходимо использовать RunWait, или ShellExecuteWait
 
Автор
I

irchik

Новичок
Сообщения
4
Репутация
0
Ребята, спасибо большое! за помощь и за пояснение. все заработало как надо
 
Верх