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.
- Podłącz dysk twardy do komputera i poczekaj, aż komputer wykryje dysk twardy
- Otwórz narzędzie do przesyłania FW
- Kliknij RESCAN i poczekaj, aż HDD pojawi się w narzędziu
- Kliknij Przeglądaj, aby znaleźć pierwszy plik FW.
- Następnie zaznacz pole wyboru obok dysku twardego pokazane w narzędziu.
- Kliknij POBIERZ i naciśnij enter przy następnym komunikacie ostrzegawczym.
- Poczekaj na zakończenie pobierania i naciśnij OK po wyświetleniu komunikatu o powodzeniu.
- Powtórz kroki od 3 do 7 dla drugiego pliku FW.
- 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
}
}
źródło
Odpowiedzi:
Kilka myśli:
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.
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.
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.
Użyj WinWaitActive po każdym wystąpieniu WinActivate, aby upewnić się, że okno jest aktywne przed kontynuowaniem.
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ę.
źródło