Skrypt AHK jest niestabilny podczas działania

2

Pracuję w firmie produkującej zewnętrzne dyski twarde. Mam wymaganie aktualizacji FW dla tysięcy dysków twardych. Muszę przesłać dwa pliki po kolei, aby zakończyć przesyłanie. Wykonanie przetwarzania ręcznego wymaga czasu, a także pozwala na wystąpienie błędu ludzkiego. Postanowiłem więc zautomatyzować naciśnięcia klawiszy i kliknięcia myszą za pomocą Auto Hot Key. Skompilowałem również skrypt. Jednak skrypt jest niestabilny. Czasami działa dobrze. Czasami kliknięcie kontrolne nie działa. Czasami kluczowe dane wejściowe nie zostaną wpisane jako pełne. Ale na podstawie mojej wiedzy skrypt jest w porządku. Jeśli wystąpi jakikolwiek błąd, popraw mnie. Chcę też bezpiecznie usunąć dysk, więc jeśli jest jakieś kodowanie, proszę go również dodać

Mój proces jest wyjaśnienie, jak poniżej.

  1. Podłącz dysk twardy do komputera i poczekaj, aż komputer wykryje dysk twardy
  2. Otwórz narzędzie do przesyłania FW
  3. Kliknij RESCAN i poczekaj, aż HDD pojawi się w narzędziu
  4. Kliknij Przeglądaj, aby znaleźć pierwszy plik FW.
  5. Następnie zaznacz pole wyboru obok dysku twardego pokazane w narzędziu.
  6. Kliknij POBIERZ i naciśnij enter przy następnym komunikacie ostrzegawczym.
  7. Poczekaj na zakończenie pobierania i naciśnij OK po wyświetleniu komunikatu o powodzeniu.
  8. Powtórz kroki od 3 do 7 dla drugiego pliku FW.
  9. Kliknij zamknij i Bezpiecznie usuń dysk twardy.

Poniżej znajduje się mój skrypt.

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
}
}
Zrodzony ze smoka
źródło
Nie polegaj na poradach ludzi w Internecie, aby wykonać tak bardzo ważne zadanie dotyczące niezawodności i użyteczności dysków twardych ludzi. Poproś kogoś, aby faktycznie opracował i przetestował oprogramowanie, abyś mógł to zrobić automatycznie!
allquixotic
erm. Nie, AHK jest tutaj całkowicie na ten temat. Oprócz tego, co powiedział @allquixotic, dość trudno jest przetestować odpowiedź bez znajomości używanego oprogramowania, a jeśli istnieją inne wąskie gardła
Journeyman Geek
Ponadto, być może, co ważniejsze, automatyzacja graficznego interfejsu użytkownika systemu Windows zawsze będzie z natury wadliwa z uwagi na warunki wyścigu, synchronizację, opóźnienie wejścia itp. Zamiast tego uzyskaj dostęp do kodu źródłowego narzędzia do łatania oprogramowania układowego i napisz -interaktywna (oparta na konsoli) wersja, którą można zautomatyzować za pomocą flag wiersza polecenia lub pliku konfiguracyjnego i automatycznie czekać na dysk twardy, a następnie automatycznie flashować oprogramowanie układowe, jeśli dotyczy. To zadanie wymaga znacznie solidniejszego rozwiązania niż wydaje się, że próbujesz tutaj.
allquixotic
Dzięki za komentarze. Pozwól mi to wyjaśnić i popraw, jeśli się mylę. Mówicie, że niestabilność nie wynika z mojego skryptu, ale z naturalnego zachowania GUI systemu Windows, które występuje z automatyzacji, prawda? Inną sprawą jest to, że narzędzie do łatania oprogramowania układowego jest narzędziem strony trzeciej i nie mogę zobaczyć ani zmodyfikować jego kodu źródłowego. To narzędzie jest dostarczane przez klienta, który chce, abyśmy zaktualizowali oprogramowanie wewnętrzne. Rozmawiałem z nimi, aby zautomatyzować proces, ale już tego odmówili. Dlatego próbowałem innej opcji i znalazłem AHK.
Dragonborn
@Dragonborn - Szczerze mówiąc, to, co opisujesz, to naturalne zachowanie prawie każdego nowoczesnego GUI. Kolega z biura opisuje umieszczenie najnowszej wersji Ubuntu na komputerze, który miał ponad 10 lat. Opisuje on, że musi poczekać na ruch myszy, nowoczesny system operacyjny jest jednocześnie szybszy i bardziej zasobochłonny. Chodzi o to, że nasza elektronika staje się szybsza, ponieważ mogą one robić więcej, co oznacza, że ​​niektóre bardzo podstawowe koncepcje dotyczące interfejsów użytkownika stają się coraz bardziej złożone w miarę upływu czasu. Każde źródło programowania można kupić za odpowiednią cenę.
Ramhound,

Odpowiedzi:

1

Kilka myśli:

  1. Jeśli powrócisz na poziomie błędu w pierwszych kilku wierszach, nie ma potrzeby enkapsulowania reszty skryptu w instrukcji Else i nawiasach zamykających. Nie są potrzebne.

  2. Korzystanie z WinWait nie jest takie samo jak WinWaitActive. Okno może istnieć bez aktywności, więc zawsze używaj WinWaitActive, chyba że musisz szukać okna w tle. Korzystanie z WinWait może powodować, że wykonywanie skryptu będzie kontynuowane po instrukcji wait przed aktywowaniem okna, powodując niektóre z opisywanych problemów.

  3. O ile nie ma potrzeby przełączania się między Send i SendInput, trzymaj się jednego lub drugiego ... zwykle SendInput jest bardziej preferowaną opcją z powodów wyjaśnionych w plikach pomocy. Używanie obu z nich (w zależności od używanego programu) może powodować problemy z synchronizacją sposobu wysyłania kluczy.

  4. Użyj WinWaitActive po każdym wystąpieniu WinActivate, aby upewnić się, że okno jest aktywne przed kontynuowaniem.

  5. W przypadku kodu, który się powtarza, spróbuj użyć podprogramu, tj. Gosub lub wywołania funkcji. Ponieważ położenie pliku ulega zmianie, można ustawić położenie pliku za pomocą zmiennej między wywołaniami lub użyć tej zmiennej jako parametru wywołania funkcji. Dzięki temu nie będziesz musiał pisać wszystkiego dwa razy, jeśli zmienisz procedurę.

JJohnston2
źródło
Dzięki za Twoją sugestię. Pozwól mi ponownie napisać skrypt i poszukać rozwiązania.
Dragonborn
Innym pomocnym narzędziem, które powinno być potrzebne, jest wstawianie instrukcji uśpienia, więc jeśli skrypt robi coś zbyt szybko dla systemu Windows, możesz spróbować wstawić nominalną instrukcję uśpienia wynoszącą kilkaset milisekund. Wstawienie znacznie dłuższego polecenia uśpienia (tj. Kilku sekund) może również pomóc w określeniu problemów. Liberalne użycie polecenia tooltip jest również pomocne w zrozumieniu, gdzie program jest wykonywany, gdy oglądasz, jak działa.
JJohnston2