工作中会给同事制作一些AHK辅助程序,编译成EXE文件后分发给同事使用,有时同事反馈一些小问题,或者自己做了一些优化,又得重新分发给同事,虽然我们都处于同一个局域网,也可以访问同一个公共文件夹,但手动替换程序再运行总归有点麻烦,以下AHK代码可实现AHK程序热更新,彻底解决此问题
;首先设定一个局域网文件夹地址,用于存放最新版本的程序文件
路径:="\\192.168.100.16\辅助程序\"
#SingleInstance force
if FileExist(A_ScriptDir . "\更新.bat")
FileDelete,%A_ScriptDir%\更新.bat
路径:=路径 . A_ScriptName
if FileExist(路径)
{
FileGetTime,tmp1,%路径%
FileGetTime,tmp2,%A_ScriptFullPath%
if (tmp1>tmp2) ;局域网的文件比目前运行的文件修改日期更靠后
{
tmp1:=A_ScriptDir . "\更新.bat"
FileAppend,
(
@echo off
echo 程序有新版本,正在准备更新文件,稍后会重新启动
ping 127.1 -n 1 >nul 2>nul
:start
tasklist /nh|find /i "%A_ScriptName%"
if ERRORLEVEL 1 goto L1
goto L2
:L1
echo 正在更新文件
ping 127.1 -n 1 >nul 2>nul
copy /y %路径% %A_ScriptDir%\
if exist "%A_ScriptFullPath%" goto L3
goto L1
:L3
cd %A_ScriptDir%\
start %A_ScriptName%
exit
:L2
echo 等待主程序退出
ping 127.1 -n 1 >nul 2>nul
goto start
),%tmp1%
run %tmp1%
ExitApp
}
}
可将以上代码保存到一个.ahk脚本文件里,比如”D:\热更新.ahk”,然后只要在新写的脚本开头加上以下代码,便可让新脚本拥有热更新功能
#Include D:\热更新.ahk
1
都是 膜拜大佬们
goto不是不建议用吗
这里的goto是cmd里的语句,ahk是不会执行的;
用goto是为了在cmd里实现一个自定义的条件循环,高级编程语言不推荐使用goto是因为这个功能太过自由,用多了结构混乱(毕竟想跳哪就跳哪),会很容易产生BUG,而且程序难懂,换个人可能都看不懂想要干嘛?
tips:其实高级语言的循环命令在汇编层面都是goto(jump指令),但这是编译器写的,所以没有BUG
我认为(也许我的观点有错误)不应当过于关注语法或者推荐或者不推荐,应当使用函数或者类,把不好的语法,不推荐的语句和有毒的字符封装到代码块中,减小或消除影响和隐患。
应当关注效果、效率和感受,只要感觉舒服,只要使用之后心情舒畅,多用一点GOTO也是无伤大雅的。把代码包裹起来,即使代码要作乱要造反也只是在函数内部或者类内部折腾,不会把毒副作用传递到函数体外部,加强封装外壳的强度。
应当尊重不完美的语句和不完美的代码,特别是能够通过压力测试和环境测试的代码。
只要能够在各种恶劣环境中生存下来的代码就是好代码,哪怕代码中含有GOTO语句或者直通内存读写。要与不完美的代码和谐相处,因为,世界上没有完美的事物。
说的对,限制某些命令的使用是为了适应人的思维,因为人和机器理解程序的方式完全不一样,但机器不是程序的生产者,为了使人能够更简单快速的生产程序,并且机器也可以理解人生产出来的程序,才诞生了各种高级编程语言,实际上每种高级编程语言都是为了解决当时的一些编程痛点