If statement 如果在AutoIt中,请避免嵌套

If statement 如果在AutoIt中,请避免嵌套,if-statement,nested,autoit,If Statement,Nested,Autoit,下面是我的AutoIt代码。我想减少这段代码,避免在。。。其他的函数中的EndIf构造 我该怎么做 Func launchTestsCC($partenaire, $projet) If $CometEnv = "DEV" Or $CometEnv = "VAL" Then initDossierFormConfig($partenaire) initPartenaireWin($partenaire) Sleep(500)

下面是我的AutoIt代码。我想减少这段代码,避免在。。。其他的函数中的EndIf构造

我该怎么做

Func launchTestsCC($partenaire, $projet)
    If $CometEnv = "DEV" Or $CometEnv = "VAL" Then
        initDossierFormConfig($partenaire)
        initPartenaireWin($partenaire)
        Sleep(500)
        For $i = 2 To 8 Step 1
            $ouvrirDossier = ouvrirDossier($configDossier[2], $configDossier[3], "ADI,C", $configDossier[4], $configDossier[5], False)
            ConsoleWrite("$ouvrirDossier ==> " & $ouvrirDossier & @CRLF)
            If $ouvrirDossier = 1 Then
                Sleep(1000)
                jabSetCombo("", "FRAIS MEDICAUX", 3)
                jabSetCombo("", $listsContrats[$i], 4)
                ConsoleWrite("$listsContrats[" & $i & "] ==> " & $listsContrats[$i] & @CRLF)
                jabSetText("", $currentDate, 5)
                jabSetCombo("", $configDossier[6], 5)
                jabSetCombo("", $configDossier[7], 6)
                jabSetText("", "19549", 7)
                $valider = jabClicBouton("Valider")
                If $valider = 1 Then
                    If getWinError() = 1 Then
                        ConsoleWrite("getWinError() $valider ==> 1" & @CRLF)
                        setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Dossier créer", "TEST OK")
                        $benef = jabClicBouton("ADI,FM,B")
                        If $benef = 1 Then
                            If getWinError() = 1 Then
                                $ajouter = jabClicBouton("Ajouter")
                                $searchTextbenef = searchTextInPageTimeOut("jabGetLabel", "Appliquer à :", 5)
                                If $ajouter = 1 And $searchTextbenef = 1 Then
                                    selectCheckBox("", 3)
                                    $x4 = 0
                                    $y4 = 0
                                    $checkBoxS3P3 = rechercheImage("Benef_S3P3.bmp", 5, 1, $x4, $y4, "")
                                    If $checkBoxS3P3 = 1 Then
                                        $codeRetour = cliqueSur("Benef_S3P3.bmp", -65, 0)
                                        If $codeRetour = 0 Then
                                            ConsoleWrite("Erreur en séléctionant S3P3" & @CR)
                                            setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Erreur en séléctionant S3P3", "TEST KO")
                                        Else
                                            $valider = jabClicBouton("Valider")
                                            If $valider = 1 Then
                                                If getWinError() = 1 Then
                                                    $retour = jabClicBouton("Retour")
                                                EndIf
                                            EndIf
                                        EndIf
                                    EndIf
                                Else
                                    setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Probleme au clic sur ajouter benef", "TEST OK")
                                EndIf
                            Else
                                ConsoleWrite("getWinError() $benef ==> 0" & @CRLF)
                                setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Impossible d'ajouter des bénéf", "TEST KO")
                                ContinueLoop
                            EndIf
                        EndIf
                    Else
                        ConsoleWrite("getWinError() $valider ==> 0" & @CRLF)
                        $suiteConfig = "Cadence de recouvrement : " & $configDossier[8] & @CR & "Mode de recouvrement : " & $configDossier[9]
                        $disConfig = "Paramètres du dossier : " & $configDossier[2] & " | " & $configDossier[3] & " | " & $configDossier[4] & " | " & $configDossier[5] & @CR & $suiteConfig
                        setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Message d'erreur ou Warning" & @CR & $disConfig, "TEST KO")
                    EndIf
                EndIf
            Else
                ConsoleWriteError("Erreur ouverture dossier " & $partenaire & @CRLF)
                $suiteConfig = "Cadence de recouvrement : " & $configDossier[8] & @CR & "Mode de recouvrement : " & $configDossier[9]
                $disConfig = "Paramètres du dossier : " & $configDossier[2] & " | " & $configDossier[3] & " | " & $configDossier[4] & " | " & $configDossier[5] & @CR & $suiteConfig
                setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Erreur ouverture dossier/Temps dépassé pour ouvrir le dossier" & @CR & $disConfig, "TEST KO")
                ContinueLoop
            EndIf
        Next
    EndIf
EndFunc   ;==>launchTestsCC

让if语句具有多个条件而不是定义多个if语句可能会对您有所帮助。如AutoIt帮助文件中所述:

表达式可以包含AND、OR、OR或NOT的布尔运算符,也可以包含逻辑运算符=、=、=,并在需要时用括号分组

下面是一个例子:

if $myValue = 1 AND $yourValue = 2 Then
    ...
EndIf

将它分成多个函数并调用第一个函数,每个函数中的函数调用下一个函数。例如,如果要创建和装饰窗,步骤如下:

- Create the window
- Decorate the window
您可以编写2个对应于2个步骤的函数和1个隐藏实现的函数,如下所示:假设_CreateWindow返回已创建窗口的句柄,如果无法创建窗口,则返回Null;如果未发生错误,则返回布尔值True;如果无法装饰窗口,则返回布尔值False

Func _createDecoratedWindow()
  Local $hwnd

  Switch _createDecoratedWindow__createWindow($hwnd)
  Case 'createWindow' ; A failure occurs at createWindow step
    ; Do something on failure, e.g: write an error message to log file
  Case 'decorateWindow' ; A failure occurs at decorateWindow step
    ; Code to execute when the step decorateWindow failed
  EndSwitch

  Return $hwnd
EndFunc

Func _createDecoratedWindow__createWindow(ByRef $hwnd)
  $hwnd = _CreateWindow(...)

  If $hwnd <> Null Then ; Check whether the operation is success
    ; Do something on success before proceed to the next step
    Return _createDecoratedWindow__decorateWindow($hwnd) ; Next step
  Else
    ; You can add some code to execute everytime the operation is failed here
    Return 'createWindow' ; Return name of the step at which the chain is broken
  EndIf
EndFunc

Func _createDecoratedWindow__decorateWindow(ByRef $hwnd)
  Local $decorateSuccess = _DecorateWindow($hwnd)

  If $decorateSuccess Then
    Return ; No error occur
  Else
    ; Do something when error occurs at this step
    Return 'decorateWindow'
  EndIf
EndFunc
并将上一步更改为调用此步骤,而不是_createDecoratedWindow u decorateWindow

然后写一个包装

Func operationName(...)
  ...
  Switch CallTheFirstStep()
  Case 'firstStep'
    AdditionalActionsToHandleError()
    ...
  EndIf
  ...
EndFunc
注意:为了避免名称冲突,我的示例中的函数名称都很难看。

使用switch:或select:语句来处理此问题。
Func _createDecoratedWindow__createWindow(ByRef $hwnd)
  $hwnd = _CreateWindow(...)

  If $hwnd <> Null Then
    ; On success code
    ; Just change the line below and you're done
    Return _createDecoratedWindow__resizeWindow($hwnd)
  Else
    ; On failure code
    Return 'createWindow'
  EndIf
EndFunc
Func stepName(...)
  PerformTheOperation()

  If TheOperationIsSuccess() Then
    OnSuccess()
    Return NextStep() ; if any
  Else
    OnFailure()
    Return 'stepName'
  EndIf
EndFunc
Func operationName(...)
  ...
  Switch CallTheFirstStep()
  Case 'firstStep'
    AdditionalActionsToHandleError()
    ...
  EndIf
  ...
EndFunc