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, {Raw}Location of First File
Send, {Enter}
}
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, {Enter}
}
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, {Raw}Second FW File location
Send, {Enter}
}
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, {Enter}
}
Winwait, Download Successful
if ErrorLevel
{
    MsgBox, WinWait timed out.
    return
}
else
{
ControlClick, OK, Download Successful
sleep, 1500
ControlClick, Exit, Application Window name
}
}

1 ответ1

1

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .