找回密码
 加入
搜索
查看: 5361|回复: 9

[系统综合] 读取自设的环境变量[已解决]

  [复制链接]
发表于 2010-9-24 11:12:41 | 显示全部楼层 |阅读模式
本帖最后由 einkhe98 于 2010-10-7 15:10 编辑

使用AU3自带的EnvGet只能读取到计算机内置的系统环境变量,

但自己用set添加的环境变量就读不到了.

求教各位大大... 谢谢!
-------------------------------
2010-10-07

今天重启了电脑, 之前建立的环境变量可以用 EnvGet 读取了, 之前论坛上和三恨的刷新注册表的代码试了个遍都是不行的,

看来重启电脑和刷新注册表, 还是存在区别的.
发表于 2010-9-24 12:02:38 | 显示全部楼层
回复 1# einkhe98

是不是那里写错了?
EnvSet("MYENV", "你好")
MsgBox(0, 0, EnvGet("MYENV"))

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-9-26 20:11:47 | 显示全部楼层
楼主的要读的自设环境变量应该不是 AU3 函数 EnvSet 设置的,刚试了一下,用操作系统命令 set 设置了一个环境变量,AU3 的 EnvGet 的确读取不了。
 楼主| 发表于 2010-9-27 16:22:33 | 显示全部楼层
是的, 正是楼上那位兄弟说的, 不是由 AU3 函数 EnvSet  设置的,
而是由在cmd窗口下, 用dos系统命令set 设置的,
例如在cmd窗口下输入 set Dept.=Purchase 回车,
再用set回车查看, 可以看到已经添加了环境变量 Dept.=Purchase
但这个环境变量 Dept. 用EnvGet返回值是空的.
发表于 2010-9-27 17:43:11 | 显示全部楼层
回复 4# einkhe98
可以自写函数解决。笨办法,作参考。
#include <array.au3>
#include <file.au3>

$evnar = _envget("temp");如果$evnar=_envget("")参数为空,返回数组。
If IsArray($evnar) Then
        _ArrayDisplay($evnar)
Else
        MsgBox(0, 0, $evnar)
EndIf

Func _envget($env)
        $envgetall = RunWait(@ComSpec & " /c " & "set >env.ini", @ScriptDir, @SW_HIDE)
        $str = "[set]" & @CRLF & FileRead("env.ini")
        $Hfile = FileOpen("env.ini", 2)
        FileWrite("env.ini", $str)
        FileClose($Hfile)
        If $env = '' Then
                $iniread = IniReadSection("env.ini", "set")
        Else
                $iniread = IniRead("env.ini", "set", $env, "error")
        EndIf
        Return $iniread
        FileDelete("env.ini")
EndFunc   ;==>_envget

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

 楼主| 发表于 2010-9-27 17:57:05 | 显示全部楼层
本帖最后由 einkhe98 于 2010-9-27 18:26 编辑

谢谢楼上的兄弟, 辛苦了!

测试了一下, 有些没有意想到的结果:

启动一个cmd, 用 set 添加的自定义环境变量, 只存在于当前cmd, 另运行一个cmd 看不到之前那个cmd中 set 添加的自定义环境变量,
导致的结果是, 当前cmd窗口中 set > env.ini ,  env.ini 中有自定义的环境变量 ,
AU3代码中 RunWait(@ComSpec & " /c " & "set > env.ini", @TempDir, @SW_HIDE) , env.ini 里就不会有之前cmd窗口中用set 添加的自定义环境变量了.

看来这个自定义的环境变量要保存下来, 要通过注册表了.
发表于 2010-9-27 18:35:10 | 显示全部楼层
set本来就只对当前的cmd进程有用,此题貌似无意义…
 楼主| 发表于 2010-9-28 11:57:48 | 显示全部楼层
恩, 此set无意义, 但发现另一个问题:

如下代码之后, 将建立一个名为 LogonScripts5 的环境变量:

_EnvCreate("LogonScripts5","\\server01\netlog\dg-it5.bat")
EnvUpdate()

Func _EnvCreate($_EnvName,$_EnvValue)
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
$objVariable = $objWMIService.Get("Win32_Environment").SpawnInstance_   ;使用spawninstance_方法,创建空白环境变量
;设置环境变量属性
$objVariable.Name = $_EnvName
$objVariable.UserName = "<System>"
$objVariable.VariableValue = $_EnvValue
$objVariable.Put_  ;提交完成
Return SetError(-1)
EndFunc
----------------

之后运行 cmd ,  使用 set 可以看到刚刚建立的 LogonScripts5 这个环境变量.
若使用 set > c:\env.log , 则 env.log 里也会有  LogonScripts5 这个环境变量.
或是先建立一个c:\env.bat , 内容为 set > c:\env.log  , 直接执行env.bat , 则 env.log 里也会有  LogonScripts5 这个环境变量.

但如果在是AU3 里面, 使用 _rundos("set > c:\env.log ") , 或是 RunWait(@ComSpec & " /c " & "set > c:\env.log", @ScriptDir, @SW_HIDE)
或是Runwait("c:\env.bat")
执行出来的 env.log 都没有 LogonScripts5 这个环境变量.

以上都是基于建立 LogonScripts5 这个环境变量后, 计算机还未重启, 三恨居士的各种刷新注册表的方式或代码都执行过.
发表于 2010-9-28 18:19:22 | 显示全部楼层
回复 8# einkhe98

重启动一下系统就可以看见了
发表于 2010-9-28 18:36:09 | 显示全部楼层
辛苦了!辛苦了!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 21:39 , Processed in 0.101258 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表