Делай... До тех пор пока -loop не выйдет

local $results, $h, $PID, $BlueStacks_Path

$BlueStacks_Path = @ProgramFilesDir & "\BlueStacks\"
$BlueStacks_Path = StringReplace($BlueStacks_Path, "\\", "\")
$h = Run($BlueStacks_Path & "hd-Adb connect localhost","","",$STDIO_INHERIT_PARENT)
sleep(1000)
$PID = run($BlueStacks_Path & "HD-Frontend.exe Testing")
WinGetProcess($PID)
sleep(1000)
Do
    $result = run($BlueStacks_Path & "HD-Adb shell getprop sys.boot_completed", "", "", BitOR($STDIN_CHILD, $STDERR_MERGED))
    $Read = StdoutRead($result)
    ConsoleWrite("$Read : " & $Read & @CRLF)
    sleep(1000)
until $result = 1

Интересно, почему я получаю бесконечный цикл при проверке, открыт ли BlueStacks.

Если я делаю это на основе командной строки, все работает. Но когда я помещаю его в AutoIt, он просто зацикливается, потому что ConsoleWrite() шоу $Read возвращает пробел, а не 1 или же device not loaded,

Что я делаю неправильно?

1 ответ

Что я делаю неправильно?

Согласно документации - Справочник по функциям -Run():

Возвращаемое значение
Успех: идентификатор процесса, который был запущен.
Неудача: 0 и устанавливает @error флаг ненулевым.

ПИД вряд ли будет 1, Если какой-либо0 значение должно выйти из цикла (в соответствии с Документация - Справочник по языку - Операторы), а затем изменить последнюю строку на любой из:

  • Until $result или же
  • Until $result > 0 или же
  • Until Not ($result = 0)

Или используя While...WEnd петля; пример:

Global Const $g_sFile = 'notepad.exe'
Global       $g_iPID  = 0

While Not $g_iPID

    $g_iPID = Run($g_sFile)

WEnd

Тем не менее, большинство причин для Run() Ошибка не может быть решена простым повторным вызовом.

Если я делаю это на основе командной строки, все работает.

Простой способ вернуть вывод STD из (отдельных) аргументов командной строки:

#include <AutoItConstants.au3>

Global Const $g_iDelay = 250
Global Const $g_sCom   = @ComSpec & ' /c '
Global Const $g_aCmd   = [ _
                         'help', _
                         'dir/w', _
                         'ping localhost' _
                         ]

Global       $g_iPID   = 0
Global       $g_sSTD   = ''

For $i1 = 0 To UBound($g_aCmd) - 1

    $g_iPID = Run($g_sCom & $g_aCmd[$i1], '', @SW_HIDE, $STDERR_MERGED)

    While ProcessExists($g_iPID)

        Sleep($g_iDelay)

    WEnd

    $g_sSTD = StdoutRead($g_iPID)
    ConsoleWrite($g_sSTD & @CRLF)

Next

Связанные

Другие вопросы по тегам