;2015-10-27 ;v1.2 ;修复不兼容AutoHotkey内置变量的bug ;增加和两种在配置文件中使用的行首处标记,标记所在行的有效性由系统位数决定 ;2015-10-23 ;v1.0 #Persistent #SingleInstance force DetectHiddenWindows On ; 允许探测脚本中隐藏的主窗口。 SetTitleMatchMode 2 ; 避免需要指定如下所示的文件的完整路径。 OnExit, ExitSub Menu,Tray,Icon,%A_WinDir%system32Shell32.dll,40,1 进程命令:={} OSBit:=A_Is64bitOS?64:32 OSBitOmit32:=A_Is64bitOS?64: goto RunSub Return RunSub: SplitPath, A_ScriptFullPath, , , , ScriptNameTemp ;获取脚本名 IfNotExist, %A_ScriptDir%%ScriptNameTemp%.ini { ContentTemp=#~ `;小工具管理器_v1.2 2015-10-27 by LL`n`n#~ `;此脚本用于集中启动和关闭需要常驻内存的小工具类程序,请按格式在尾部自行添加;`n#~ `;用“;”或“#~”注释掉的行会被自动跳过;`n#~ `;以和开头的行,仅在指定位数的系统中有效,无标记的则为通用;`n#~ `;务必将程序路径用双引号引起来;`n#~ `;要添加不必自动启动而又需要自动关闭的程序时,将等号右边留空即可;`n#~ `;可以使用两个变量在不同系统位数指向不同的主程序;`n#~ `;变量`%OSBit`%在32位系统下值为“32”,在64位系统下值为“64”;`n#~ `;变量%OSBitOmit32%在32位系统下为空值,在64位系统下值为“64”;`n#~ `;没有经过严格测试,也没有出错时的处理机制,造成不便,请勿拍砖;`n`n#~ `;示例:`n#~ `;Notepad.exe="`%A_WinDir`%System32Notepad.exe" "C:log.txt"`n`n FileAppend, %ContentTemp%, %A_ScriptDir%%ScriptNameTemp%.ini Run %A_ScriptDir%%ScriptNameTemp%.ini ContentTemp= } Loop, Read, %A_ScriptDir%%ScriptNameTemp%.ini ;按行读取与脚本名同名的配置文件 { CurrentLineContent:=A_LoopReadLine if % A_LoopReadLine="" ;跳过空行 continue IfInString, A_LoopReadLine, #~ ;跳过注释行 continue IfInString, A_LoopReadLine,; ;跳过注释行 continue if % RegExMatch(A_LoopReadLine, "S)^<.>", AppBitMark)0 ;如果行首处存在标记用字符串 { if % SubStr(A_LoopReadLine, 1, StrLen(AppBitMark))="" ;如果为兼容的行 CurrentLineContent:=RegExReplace(A_LoopReadLine, "^<.>") ;则去掉行首处标记,视为通用程序处理 else continue ;否则跳过不兼容的行 } ExeName:=RegExReplace(CurrentLineContent, "S)(="".+)|(=$)") ;匹配等号前的部分 StringMid, ExeCmd, CurrentLineContent, StrLen(ExeName)+2 ;%ExeCmd%包含程序路径和参数 RegExReplace(ExeCmd, "S)(%[^%]+?%)", "", VarCount) ;计算该行配置中变量的个数 FoundPos=0 Loop % VarCount { FoundPos := RegExMatch(ExeCmd, "S)(%[^%]+?%)", VarInExeCmd, FoundPos+1) ;提取变量名 StringReplace, UnquotedVarInExeCmd, VarInExeCmd, `%, , All ;去掉变量名两边的"%" UnquotedVarInExeCmd:=%UnquotedVarInExeCmd% ;将变量名转换为具体值 StringReplace, ExeCmd, ExeCmd, %VarInExeCmd%, %UnquotedVarInExeCmd%, All ;替换运行命令中的变量名为具体值 } 进程命令.Insert(ExeName,ExeCmd) ;~ msgbox % 进程命令[ExeName] Process, Exist, %ExeName% if % ErrorLevel=0 ;如果不存在同名进程 Run % 进程命令[ExeName] ;则运行指定程序 } Return ExitSub: Menu, Tray, NoIcon MsgBox, 36, 提示, 是否关闭所有小工具? IfMsgBox, Yes ;如果选择“是” { for ExeName,ExeCmd in 进程命令 Process, Close, %ExeName% ;则关闭所有进程 ExitApp } else ExitApp Return