最近利用AutoHotKey這個神器,寫了幾個腳本,自動化完成了平時工作中的一部分繁瑣又重複的事情。總結一下編寫腳本中遇到的問題:
注意:腳本運行不正確,可能是文件編碼不兼容,存爲UTF-8 試試^_^
給腳本加上運行圖標
icon.ico和腳本要放到同一個文件夾裏
IfExist, icon.ico
{
Menu TRAY, Icon, icon.ico
}
AutoHotKey中熱鍵腳本里調用其它熱鍵
使用Gosub,把熱鍵當做標籤使用。
Gosub #s ;#s是win+S熱鍵
發送指令 Send 發送Win、Alt、Ctrl鍵的時候使用#、!、^,而不是{Alt}這種,
把.ahk文件打包成.exe文件
使用自帶的Convert .ahk to .exe即可,還可以設置程序圖標,如果想讓exe程序雙擊就運行的話,可以把#g:: 這個設置的熱鍵直接刪除。
我寫的腳本:
從服務器get新版本解壓到本地目錄
SetTitleMatchMode, MatchMode SetTitleMatchMode, Fast|Slow這是WinTitle 參數的匹配模式。一般必帶!
#g:: ;熱鍵是Windos鍵+G
SetTitleMatchMode, 2
SetTitleMatchMode, slow
IfWinNotExist,Q-Dir 5.70 ;這句話要想起作用,前面兩句必須加!
Run C:\Program Files\Q-Dir\Q-Dir.exe
Path = D:\work\release
TimeNow = %A_YYYY%%A_MM% ;%A_DD% 獲取現在的年月,因爲文件名是年月日組合,防止某日的所有編譯都不成功,所以採用年月組合
FileList = ;初始爲空
FileName =
rar = %A_ProgramFiles%\WinRAR\WinRAR.exe
Loop,\\192.168.1.111\方案設計師\Main\%TimeNow%*.*,1,0 ;找到所有包含今天年月名的文件夾
FileList = %FileList%%A_LoopFileName%`n ;`n是換行符
Sort, FileList,R ;逆序排列
Loop, parse, FileList, `n ;解析字符串,讀取FileList
{
if A_LoopField = ;忽略列表末尾的空項.
continue
FileName = %A_LoopField% ;
IfExist,\\192.168.1.111\方案設計師\Main\%FileName%\%FileName%.release.pdb.rar ;判斷文件是否存在,因爲有編譯不成功的情況
break
}
SetWorkingDir,\\192.168.1.111\方案設計師\Main\%FileName%\
FileGetTime,OutputVar,%FileName%.release.pdb.rar,c ;獲取文件時間戳
Loop, read, %Path%\更新歷史.txt
last_line := A_LoopReadLine ;獲取文本文件的最後一行,這裏存着上次更新的文件的時間戳
if ( last_line = OutputVar )
{
msgbox,4,,%FileName%:爲最新可用文件夾,本地文件與服務器一致耶! `n`n按Y:將只拷貝“更新”文件夾下的DLL文件(如果有的話:D)...`n`n按N:我好閒,讓我們再更新一次吧!
IfMsgBox Yes
{
IfExist,\\192.168.1.111\方案設計師\Main\%FileName%\更新\
{
FileCopy,\\192.168.1.111\方案設計師\Main\%FileName%\更新\*.dll,%Path%\bin
MsgBox,更新dell成功
return
}
else
{
MsgBox,48,,嘛也沒有,白忙活一趟:-( ;a joke ^_^
}
return
}
else
{
Gosub GetV
FileAppend,%OutputVar%`n,%Path%\更新歷史.txt ;把剛更新的文件的時間戳寫入txt的最後一行,方便下次讀取比對
}
}
else
{
Gosub GetV
FileAppend,%OutputVar%`n,%Path%\更新歷史.txt ;寫入
}
return
;Gosub的標籤
GetV: ;獲取方案設計師版本
RunWait,%rar% X -o+ %FileName%.release.pdb.rar %Path% ;解壓的命令行
IfExist,\\192.168.1.111\方案設計師\Main\%FileName%\更新\
{
FileCopy,\\192.168.1.111\方案設計師\Main\%FileName%\更新\*.dll,%Path%\bin
}
SoundPlay, %A_WinDir%\Media\ding.wav
return
Visual Studio調試方案設計師
Visual Studio調試,自動編譯後打開方案設計師加載上次的bdn文件,然後鼠標點擊出圖,同時以不保存的形式關閉CAD中所有打開的圖紙。複雜的是考慮了各種調試期間的情況。取得VS現在的狀態,靠的是檢測左下角的提示信息文本。需要注意各個操作之間間隔時間不能太短,否則界面反應不過來。
;一鍵調試腳本!
#s:: ;Windows鍵+S
SetTitleMatchMode, 2
SetTitleMatchMode, slow
IfWinExist,THLGaiLiangGJ - Microsoft Visual Studio,,(Running), ;Visual Studio不在調試中的情況
{
WinActivate
Send ^{F7} ;Ctrl+F7 編譯
WinWait, - Microsoft Visual Studio,,,,Build started... ;等待含有Build started文本的窗口結束
sleep 200
WinWait, - Microsoft Visual Studio,Build succeeded,2,,
IfWinExist, - Microsoft Visual Studio,Build succeeded,,
{
Send {F5}
WinWait, 方案設計師V3.0
Gosub,OpenBDN
Gosub,Draw
return
}
else
{
Gosub,SoundError
return
}
}
else ;Visual Studio在調試中的情況
{
IfWinActive,(Running) - Microsoft Visual Studio,, ;如果Visual Studio窗口是當前是活動的窗口
{
IfWinExist,(Running) - Microsoft Visual Studio,.cpp*, ;.cpp文件代碼有改動且未保存
{
Send ^+{F5} ;Ctrl+Shift+F5 重啓調試
sleep 1000
WinWait, - Microsoft Visual Studio,,,,Build started...
sleep 200
IfWinExist,,There were build errors. ;如果Build Error
{
Gosub,SoundError
return
}
else
{
IfWinNotExist,There were build errors.
{
WinWait,方案設計師V3.0
Gosub,OpenBDN
Gosub,Draw
return
}
else ;未取到任何以上窗口文本
{
MsgBox,0,,Not My Thing... ∑( ̄□ ̄) ,
Gosub,SoundError
return
}
}
}
else
{
IfWinExist,(Running) - Microsoft Visual Studio,.h*, ;.h文件代碼有改動且未保存
{
Send ^+{F5} ;Ctrl+Shift+F5 重啓調試
sleep 1000
WinWait, - Microsoft Visual Studio,,,,Build started...
sleep 200
IfWinExist,,There were build errors. ;如果Build Error
{
Gosub,SoundError
return
}
else
{
IfWinNotExist,There were build errors.
{
WinWait,方案設計師V3.0
Gosub,OpenBDN
Gosub,Draw
return
}
else ;未取到任何以上窗口文本
{
MsgBox,0,,No Error! :) ,
Gosub,SoundSucceed
return
}
}
}
else ;文件無改動,如下斷點
{
IfWinExist,方案設計師V3.0 - [D:\
{
WinActivate
Gosub,Draw
return
}
else
{
WinActivate,方案設計師V3.0,
Gosub,OpenBDN
Gosub,Draw
return
}
}
}
}
else
{
IfWinExist,方案設計師V3.0 ;如果未改動代碼僅重新出圖
{
WinActivate
IfWinExist,方案設計師V3.0 - [D:\
{
Gosub,Draw
return
}
else
{
Gosub,OpenBDN
Gosub,Draw
return
}
}
else
{
MsgBox,0,,Have a rest! Enjoy! :-),
Gosub,SoundSucceed
return
}
}
}
return
OpenBDN:
SetTitleMatchMode, 2
SetTitleMatchMode, slow
WinMaximize
MouseClick, left, 40,40 ;相對座標,座標原點爲激活窗口的左上角
sleep 100
MouseClick, left, 100,265 ;相對座標,座標原點爲激活窗口的左上角
WinWait, ,打開項目成功!,
WinWait, ,就緒,
sleep 100
return
Draw:
SetTitleMatchMode, 2
SetTitleMatchMode, slow
WinMaximize
MouseClick, right, 200,805 ;相對座標,座標原點爲激活窗口的左上角
sleep 200
MouseClick, left, 310, 630 ;相對座標,座標原點爲激活窗口的左上角
sleep 200
;啓動構件出圖...
WinWait, ,系統即將啓動構件繪圖,請不要修改構件數據!,2, , ;超時前等待2秒
sleep 100
Send {space}
Gosub,CloseAllCAD
WinWait,方案設計師V3.0,,1200,,啓動構件出圖... ;超時前等待120秒
IfWinExist,方案設計師V3.0,構件出圖結束,,,
{
Gosub,RunCAD
Gosub,SoundSucceed
}
else
{
Gosub,SoundError
}
return
CloseAllCAD:
IfWinExist,AutoCAD 2008 - [D:\
{
WinActivate
Send closeall{Enter}
sleep 100
Loop
{
IfWinExist,AutoCAD,是否將改動保存到
send n
sleep 1000
IfWinNotExist,AutoCAD,是否將改動保存到
break
}
IfWinExist 方案設計師V3.0
WinActivate
}
return
RunCAD:
Run D:\L形蓋樑鋼筋_鋼筋設計圖紙.dxf
Run D:\work\L蓋樑\LCapBeamV4\Drawing\L形蓋樑柱式墩\L形蓋樑鋼筋構造圖.dxf
return
SoundSucceed: ;成功提示音
Loop 3
{
SoundPlay, %A_WinDir%\Media\ding.wav
sleep 1000
}
return
SoundError: ;錯誤提示音
Loop 3
{
SoundPlay,*16
sleep 1000
}
return