读取自设的环境变量[已解决]
本帖最后由 einkhe98 于 2010-10-7 15:10 编辑使用AU3自带的EnvGet只能读取到计算机内置的系统环境变量,
但自己用set添加的环境变量就读不到了.
求教各位大大... 谢谢!
-------------------------------
2010-10-07
今天重启了电脑, 之前建立的环境变量可以用 EnvGet 读取了, 之前论坛上和三恨的刷新注册表的代码试了个遍都是不行的,
看来重启电脑和刷新注册表, 还是存在区别的. 回复 1# einkhe98
是不是那里写错了?EnvSet("MYENV", "你好")
MsgBox(0, 0, EnvGet("MYENV")) 楼主的要读的自设环境变量应该不是 AU3 函数 EnvSet 设置的,刚试了一下,用操作系统命令 set 设置了一个环境变量,AU3 的 EnvGet 的确读取不了。 是的, 正是楼上那位兄弟说的, 不是由 AU3 函数 EnvSet设置的,
而是由在cmd窗口下, 用dos系统命令set 设置的,
例如在cmd窗口下输入 set Dept.=Purchase 回车,
再用set回车查看, 可以看到已经添加了环境变量 Dept.=Purchase
但这个环境变量 Dept. 用EnvGet返回值是空的. 回复 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 = "" & @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 本帖最后由 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 添加的自定义环境变量了.
看来这个自定义的环境变量要保存下来, 要通过注册表了. set本来就只对当前的cmd进程有用,此题貌似无意义… 恩, 此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 这个环境变量后, 计算机还未重启, 三恨居士的各种刷新注册表的方式或代码都执行过. 回复 8# einkhe98
重启动一下系统就可以看见了 辛苦了!辛苦了!
页:
[1]