Перейти к содержимому

AHK скрипт работает нестабильно

2

Я работаю в компании по производству внешних жестких дисков. У меня есть требование обновить FW для тысяч жестких дисков. Я должен загрузить два файла в последовательности, чтобы завершить загрузку. Ручная обработка требует времени, а также дает шанс человеческой ошибки. Поэтому я решил автоматизировать нажатия клавиш и щелчки мыши с помощью Auto Hot Key. Я также скомпилировал скрипт. Однако скрипт нестабилен. Иногда это работает нормально. Иногда щелчок управления не работает. Иногда ввод ключа не будет напечатан полностью. Но сценарий в порядке на основе моих знаний. Если есть какая-либо ошибка, пожалуйста, исправьте меня. Также я хочу безопасно удалить диск, поэтому, если есть какая-либо кодировка для него, пожалуйста, добавьте его

Мой процесс объяснения, как показано ниже.

  1. Подключите жесткий диск к ПК и дождитесь, пока компьютер обнаружит жесткий диск
  2. Откройте инструмент загрузки FW
  3. Нажмите RESCAN и дождитесь появления HDD в инструменте.
  4. Нажмите кнопку обзора для первого файла FW.
  5. Затем установите флажок рядом с жестким диском, показанным в инструменте.
  6. Нажмите ЗАГРУЗИТЬ и нажмите Enter при следующем предупреждении.
  7. Дождитесь окончания загрузки и нажмите OK после появления сообщения об успешном завершении.
  8. Повторите шаги с 3 по 7 для второго файла FW.
  9. Нажмите выход и безопасно извлеките жесткий диск.

Ниже мой сценарий.

Run, open "Application Location" Winwait, Warning if ErrorLevel { MsgBox, Window timed out. return } else { ControlClick, OK, Warning Winwait, Application Window name if ErrorLevel { MsgBox, WinWait timed out. return } else { ; Upload first FW File ControlClick, Rescan, Application Window name ControlClick, Browse, Application Window name Winwait, Open if ErrorLevel { MsgBox, WinWait timed out. return } else { SendInput, Location of First File Send,  } sleep, 1500 WinActivate, Application Window name CoordMode, Mouse, Relative Click 43, 126 ControlClick, Download, Application Window name Winwait, Warning if ErrorLevel { MsgBox, WinWait timed out. return } else { Send,  } Winwait, Download Successful if ErrorLevel { MsgBox, WinWait timed out. return } else { ControlClick, OK, Download Successful } } ; Upload Second FW File WinActivate, Application Window name ControlClick, Rescan, Application Window name ControlClick, Browse, Application Window name Winwait, Open if ErrorLevel { MsgBox, WinWait timed out. return } else { SendInput, Second FW File location Send,  } sleep, 1500 WinActivate, Application Window name CoordMode, Mouse, Relative Click 43, 126 sleep, 2000 ControlClick, Download, Application Window name Winwait, Warning if ErrorLevel { MsgBox, WinWait timed out. return } else { Send,  } Winwait, Download Successful if ErrorLevel { MsgBox, WinWait timed out. return } else { ControlClick, OK, Download Successful sleep, 1500 ControlClick, Exit, Application Window name } } 
265 просмотров
Dragonborn спросил 10 лет назад
D 82

1 ответ

1
Принятый ответ

Несколько мыслей:

  1. Если вы вернетесь к уровню ошибки в первых нескольких строках, нет необходимости инкапсулировать оставшуюся часть сценария в операторе Else и в квадратных скобках. Не нужно.

  2. Использование WinWait не совпадает с WinWaitActive. Окно может существовать, не будучи активным, поэтому всегда используйте WinWaitActive, если вам не нужно искать окно в фоновом режиме. Использование WinWait может привести к тому, что выполнение вашего скрипта продолжится после оператора wait, прежде чем окно станет активным, что вызовет некоторые проблемы, которые вы описываете.

  3. Если нет необходимости переключаться между SendInput и SendInput, придерживайтесь одного или другого ... обычно SendInput является более предпочтительным вариантом по причинам, объясненным в файлах справки. Использование их обоих (в зависимости от используемой программы) может вызвать проблемы с синхронизацией относительно того, как ключи отправляются.

  4. Используйте WinWaitActive после любых экземпляров WinActivate, чтобы убедиться, что окно активно, прежде чем продолжить.

  5. Для кода, который повторяется, попробуйте использовать подпрограмму, например, gosub или вызов функции. Поскольку местоположение файла изменяется, вы можете установить местоположение файла с переменной между вызовами или использовать переменную в качестве параметра вызова функции. Это избавит вас от необходимости переписывать все дважды, если вы измените процедуру.

Спасибо за ваше предложение. Позвольте мне переписать мой сценарий и проверить решение.

Dragonborn · 10 лет назад · 0

Еще один полезный инструмент, если он вам нужен, - это вставка операторов сна, поэтому, если сценарий делает что-то слишком быстро для окон, вы можете попробовать вставить номинальный оператор сна в несколько сотен миллисекунд. Вставка гораздо более длинного оператора сна (т. Е. Нескольких секунд) также может помочь выявить проблемы. Свободное использование команды tooltip также полезно для понимания того, где выполняется программа, когда вы наблюдаете за ее работой.

JJohnston2 · 10 лет назад · 0
JJohnston2 ответил 10 лет назад
J 1 126