windows超级运行框-表达式计算(2)—set /sets表达式

1、环境准备

  1. windows 7,8,10,11操作系统
  2. ahk 2.x_64位

2、使用方式

set/sets 表达式用于设置 用户/系统 的环境变量或者path,设置后可以通过get 表达式 查看,参考上一篇文章

  1.    输入win+R打开windows运行框 
  2.   在运行框中输入:set  java_home=c:\xxx\java1.8   ,设置一个名为java_home用户的环境变量
  3.   在运行框中输入:set  path=%java_home%\bin   ,在用户的path中添加一个值
  4.   在运行框中输入:set  -path=%java_home%\bin   , 在用户的path中删除一个值
  5.   在运行框中输入:   set  java_home=”” ,用空字符串表示删除一个环境变量,注意 使用的时候不会有任何提示,删除环境变量的时候请慎重、
  6. 上面的set代表用户环境变量,替换成sets可以修改系统环境变量,注意字符串不要加引号,空串表示删除!
  7. 上述操作会覆盖之前存在的环境变量,但是不会提示!!
  8.   表达式按== 触发结果

 

3、演示

windows超级运行框-表达式计算(2)—set /sets表达式

自行查看系统环境变量变化

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? 欢迎评论区留言讨论!

给TA捐赠
共{{data.count}}人
人已捐赠
应用

windows超级运行框-表达式计算(1)—get取值

2023-12-1 10:02:36

应用

windows超级运行框-表达式计算(3)—encode/decode编码解码

2023-12-1 10:02:59

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索