1、环境准备
- windows 7,8,10,11操作系统
- ahk 2.x_64位
2、使用方式
set/sets 表达式用于设置 用户/系统 的环境变量或者path,设置后可以通过get 表达式 查看,参考上一篇文章
- 输入win+R打开windows运行框
- 在运行框中输入:set java_home=c:\xxx\java1.8 ,设置一个名为java_home用户的环境变量
- 在运行框中输入:set path=%java_home%\bin ,在用户的path中添加一个值
- 在运行框中输入:set -path=%java_home%\bin , 在用户的path中删除一个值
- 在运行框中输入: set java_home=”” ,用空字符串表示删除一个环境变量,注意 使用的时候不会有任何提示,删除环境变量的时候请慎重、
- 上面的set代表用户环境变量,替换成sets可以修改系统环境变量,注意字符串不要加引号,空串表示删除!
- 上述操作会覆盖之前存在的环境变量,但是不会提示!!
- 表达式按== 触发结果
3、演示
自行查看系统环境变量变化
4、代码
#HotIf winActive("运行") and winActive("ahk_class #32770")
#MaxThreadsPerHotkey 10
;在运行框中执行强大的计算功能,包括数学运算等
:*?:==::{
try{
rawText:=ControlGetText("Edit1","A") ;
fullResult:=runbox.calculateExpression(rawText)
if fullResult{
ControlsetText(fullResult,"Edit1","A")
}
ControlSend("{END}","Edit1","A")
}
}
#HotIf
;==========================================================================================================系统快捷键映射
;执行各种运算取值
class runbox
{
;定时器
static spycmdTimer:=ObjBindMethod(this, "spyCmd")
;spy显示信息
static spytext:=""
;执行比表达式计算,"==" 触发,callflag是其他函数调用该方法
static calculateExpression(rawstr,callflag:=0)
{
;设置环境变量user/sys
if (a:=(inStr(rawStr,"set ")==1) and (not (str:=Trim(Ltrim(rawStr,"set")))==Trim(rawStr)))
or (inStr(rawStr,"sets ")==1 and (not (str:=Trim(Ltrim(rawStr,"sets")))==Trim(rawStr))){
result:=this.setEnvExpression(str,a?1:0) ;返回成功/失败
fulltxt:= rawStr . " " . result
return fulltxt
}
}
;设置setEnv 表达式,user=0表示系统,默认用户
;设置path时 ,set path= 清空path,set -path="xx" 删除某个path,set path="xxx"增加一个path
static setEnvExpression(str,user)
{
if index:=inStr(str:=Trim(str),"="){
key:=RTrim(subStr(str,1,index-1))
value:=LTrim(subStr(str,index+1))
if not key and not value
return "(失败)"
if value='""'{
reg.delEnv(key,user)
return not reg.getEnv(key,user)?"(删除成功)":"(删除失败)"
}else if key="path"{
reg.pathPush(value,user)
return ak.arrHas(reg.pathArr(user),value)?"(成功)":"(失败)"
}else if key="-path"{
reg.pathPop(value,user)
return not ak.arrHas(reg.pathArr(user),value)?"(成功)":"(失败)"
}else{
reg.setEnv(key,value,,user)
return reg.getEnv(key,user)?"(添加成功)":"(添加失败)"
}
}else{
return "[失败]"
}
}
}
;==========================================================================================================系统快捷键映射
;----------------------------------------------------------------------------------------------------------Reg工具类
;注册表操作工具
class reg
{
;用户环境变量位置
static HCU:="HKEY_CURRENT_USER\Environment"
;系统环境变量位置
static HLM:="HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment"
;获取当前某个环境变量的值 ,默认是当前用户
static getEnv(key,user:=1)
{
return ak.mapget(this.getEnvMap(user),key,1)
}
;获取当前所有环境变量 ,默认是当前用户
static getEnvMap(user:=1){
regpath:=user?this.HCU:this.HLM
retMap:=Map()
Loop Reg, regpath ,"KV"{
retMap.set(A_LoopRegName,RegRead())
}
return retMap
}
;删除环境变量,默认当前用户
static delEnv(key,user:=1){
regpath:=user?this.HCU:this.HLM
RegDelete regpath ,key
}
;设置环境变量,立即生效,默认是当前用户
static setEnv(key,value,type:="REG_SZ",user:=1)
{
regpath:=user?this.HCU:this.HLM
RegWrite value, type, regpath, key
}
;添加一个键值对到path ,默认是当前用户
static pathPush(key,user:=1){
arr:=this.pathArr(user)
if(arr and ak.arrHas(arr,key))
return
else
arr.push(key)
pathStr:=ak.joinArr(arr,";","","")
this.setEnv("Path",pathStr,"REG_EXPAND_SZ",user)
}
;在path中删除一个键值,默认是当前用户
static pathPop(key,user:=1){
paths:=ak.arrDelete(this.pathArr(user),key)
pathStr:=ak.joinArr(paths,";","","")
this.setEnv("Path",pathStr,"REG_EXPAND_SZ",user)
}
;返回path集合array ,默认是当前用户
static pathArr(user:=1){
retarr:=[]
pathstr:=Rtrim(this.path(user),";")
loop parse ,pathstr,";"
retarr.push(A_loopField)
return retarr
}
;返回一个path字符串,默认是当前用户
static path(user:=1){
return this.getEnv("Path",user)
}
}
;----------------------------------------------------------------------------------------------------------Reg工具类
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ak工具类class
class ak
{
;获取并保存数组中的值所在位置0
static arrHas(arr2,value)
{
for item in arr2{
if item==value
return A_index
}
return 0
}
;Func 遍历并连接对象 注意 map和Arry中只能是基本数据,否则报错
static joinObj(obj,separator:=":")
{
if type(obj)=="Array"{
return this.joinArr(obj)
}else if type(obj)=="Map"{
return this.joinMap(obj)
}else if type(obj)=="Object"{
begin:="{"
for k,v in obj.OwnProps(){
begin.=(k . ":" . this.joinObj(v) . ",") ;递归调用
}
return Rtrim(begin,",") . "}"
}else
return obj
}
;Func连接数组Array ,arr:数组 ,separator:分隔符,L: 左边添加符号 R:右边添加符号
static joinArr(arr ,separator:="," ,L:="[" ,R:="]")
{
for i in arr{
L.=(this.joinObj(i) . separator)
}
return Rtrim(L,",") . R
}
;Func 帮助map获取值,优化原生map报错问题,ignoreCase是否忽略大小写
static mapget(map1,key,ignoreCase:=0)
{
try{
if ignoreCase{
for k ,v in map1 {
if k=key
return v
}
}
return map1.get(key)
}catch as e{
return ""
}
}
;删除数组中的值
static arrDelete(arr2,value)
{
arr3:=[]
for item in arr2{
if item!=value{
arr3.push(item)
}
}
return arr3
}
}
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ak工具类class
5、总结
由于很多操作代码可以复用,单个功能代码臃肿,
完整功能参考:windows超级运行框-表达式计算(12)汇总
各位大佬觉得还可以怎么set? 欢迎评论区留言讨论!