O script AHK é instável durante a execução

2

Estou trabalhando em uma empresa de fabricação de discos rígidos externos. Eu tenho necessidade de atualizar o FW para milhares de HDDs. Eu tenho que fazer o upload de dois arquivos em sequência para que o upload seja concluído. Para fazer o processamento manual leva tempo, bem como permite a chance de erro humano. Então eu decidi automatizar os toques de tecla e cliques do mouse usando Auto Hot Key. Eu também compilei o script. No entanto, o script é instável. Às vezes funciona bem. Algumas vezes o clique de controle não funciona. Às vezes, a entrada principal não será digitada como cheia. Mas o roteiro está bem baseado no meu conhecimento. Se houver algum erro, por favor corrija-me. Também quero remover a unidade com segurança, então, se houver alguma codificação, adicione-a também

Meu processo é a explicação abaixo.

  1. Conecte o HDD ao PC e aguarde o PC para detectar o HDD
  2. Abra a ferramenta de upload do FW
  3. Clique em RESCAN e aguarde até que o HDD apareça na ferramenta
  4. Clique em procurar primeiro arquivo FW.
  5. Em seguida, selecione a caixa de seleção próxima ao HDD mostrado na ferramenta.
  6. Clique em DOWNLOAD e pressione Enter na próxima mensagem de aviso.
  7. Aguarde o término do download e pressione OK após a exibição da mensagem de sucesso.
  8. Repita as etapas de 3 a 7 para o segundo arquivo FW.
  9. Clique em exit e em Safe remove the HDD.

Abaixo está o meu script.

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
}
}
    
por Dragonborn 22.09.2015 / 10:12

1 resposta

1

Algumas reflexões:

  1. Se você retornar no nível de erro nas primeiras linhas, não será necessário encapsular o restante do script em uma instrução Else e encapsular colchetes. Não é necessário.

  2. O uso de WinWait não é o mesmo que WinWaitActive. Uma janela pode existir sem estar ativa, portanto, sempre use WinWaitActive, a menos que você precise procurar uma janela em segundo plano. Usar o WinWait pode fazer com que a sua execução de script continue após a instrução de espera antes que a janela esteja realmente ativa, causando alguns dos problemas que você está descrevendo.

  3. A menos que seja necessário alternar entre Send e SendInput, atenha-se a um ou outro ... geralmente SendInput é a opção mais preferível por motivos explicados nos arquivos de ajuda. O uso de ambos (dependendo do programa em uso) pode causar problemas de tempo sobre como as chaves são enviadas.

  4. Use WinWaitActive após qualquer instância do WinActivate para garantir que a janela esteja ativa antes de continuar.

  5. Para o código que é repetido, tente usar uma sub-rotina, por exemplo, gosub ou chamada de função. Como o local do arquivo é alterado, você pode definir o local do arquivo com uma variável entre as chamadas ou usar a variável como um parâmetro da chamada de função. Isso evitaria que você tivesse que reescrever tudo duas vezes se mudasse a rotina.

por 23.09.2015 / 06:42