我在一家外部硬盘制造公司工作。我需要升级数千个硬盘的固件。我必须按顺序上传两个文件才能完成上传。手动处理需要时间,而且容易出现人为错误。所以我决定使用自动热键自动执行按键和鼠标点击。我还编写了脚本。但是脚本不稳定。有时它工作正常。有时控制点击不起作用。有时键输入不完整。但据我所知,脚本没问题。如果有任何错误,请纠正我。另外,我想安全移除驱动器,所以如果有任何编码,请也添加它
我的过程解释如下。
- 将硬盘连接到电脑并等待电脑检测硬盘
- 打开FW上传工具
- 单击“重新扫描”并等待 HDD 显示在工具中
- 单击浏览第一个 FW 文件。
- 然后选中工具中显示的HDD旁边的复选框。
- 单击“下载”,然后在下一条警告消息中按回车键。
- 等待下载完成,显示成功消息后按确定。
- 对第二个 FW 文件重复步骤 3 至 7。
- 单击“退出”并“安全移除硬盘”。
以下是我的脚本。
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
一些想法:
如果在前几行中返回错误级别,则无需将脚本的其余部分封装在 Else 语句中并封装括号。不需要。
WinWait 的使用与 WinWaitActive 不同。窗口可以存在但未处于活动状态,因此除非您需要在后台查找窗口,否则请始终使用 WinWaitActive。使用 WinWait 可能会导致脚本执行在窗口实际处于活动状态之前继续执行等待语句,从而导致您描述的一些问题。
除非需要在 Send 和 SendInput 之间切换,否则请坚持使用其中一个... 通常 SendInput 是更可取的选项,原因在帮助文件中有说明。同时使用它们(取决于所使用的程序)可能会导致按键发送的时间问题。
在任何 WinActivate 实例之后使用 WinWaitActive 来确保窗口在继续之前处于活动状态。
对于重复的代码,请尝试使用子程序,即 gosub 或函数调用。由于文件位置会发生变化,您可以在调用之间使用变量设置文件位置,或使用该变量作为函数调用的参数。如果您更改了例程,这将使您不必重新编写所有内容两次。