我能在vbscript WSH脚本中获取环境变量吗?

23

在 Windows 脚本宿主(WSH)VBS 脚本中,读取系统环境变量是否可行?

我正在使用 Windows 脚本宿主编写 VBScript 任务,想要获取项目构建的 URL。

5个回答

31

以下是一个例子(来自这里):

Set oShell = CreateObject( "WScript.Shell" )
user=oShell.ExpandEnvironmentStrings("%UserName%")
comp=oShell.ExpandEnvironmentStrings("%ComputerName%")
WScript.Echo user & " " & comp

10
现有的回答都很有帮助,但让我来尝试一个实用性总结:
通常,您需要获取“当前进程”的环境变量定义:
CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%")

这相当于以下内容(请注意变量名称周围没有%):
CreateObject("WScript.Shell").Environment("Process").Item("TEMP")

注意:不要省略("Process)部分,否则你将得到系统范围的变量定义; 详见下文。

.ExpandEnvironmentStrings的概念更简单、更灵活:它可以扩展带有嵌入式%包含)环境变量引用的任意字符串;例如:

CreateObject("WScript.Shell").ExpandEnvironmentStrings("My name is %USERNAME%")

很少情况下,你可能需要从一个特定的作用域(而不是当前进程的作用域)访问环境变量定义。

  sScope = "System" ' May be: "Process", "User", "Volatile", "System"
  CreateObject("WScript.Shell").Environment(sScope).Item("TEMP")

注意:如上所述,省略范围参数将默认为System范围。 注意事项:以这种方式访问值不会展开它:环境变量值可以嵌套: 它们可以引用其他环境变量。
在上面的示例中,返回值为%SystemRoot%\TEMP,其中包含未展开的对%SystemRoot%的引用。
要展开结果,请像上面演示的那样将其传递给.ExpandEnvironmentStrings()

7

From here ...

Set WshShell = WScript.CreateObject("WScript.Shell")

Set WshProccessEnv = WshShell.Environment("Process")
Set WshSysEnv = WshShell.Environment("System")

Wscript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
Wscript.Echo WshProccessEnv("Path")

此外,TechNet 上有更详细的信息。

6
Set WshShell = CreateObject("WScript.Shell")    
Set WshEnv = WshShell.Environment
WScript.Echo "WINDIR=" & WshEnv.Item("WINDIR")  & vbCrLf & vbCrLf   
Set WshShell = CreateObject("WScript.Shell")
WScript.Echo "Environment System:"              & vbCrLf & _ 
         "..............................................."

For Each IEnv In WshShell.Environment("System")
    WScript.Echo IEnv
Next

WScript.Echo vbCrLf & "Environment User:"       & vbCrLf & _   
        "..............................................."

For Each IEnv In WshShell.Environment("User") 
    WScript.Echo IEnv
Next

WScript.Echo vbCrLf & "Environment Volatile:"   & vbCrLf & _ 
       "..............................................."

For Each IEnv In WshShell.Environment("Volatile")
    WScript.Echo IEnv
Next

WScript.Echo vbCrLf & "Environment Process:"    & vbCrLf & _ 
       "..............................................."

For Each IEnv In WshShell.Environment("Process")
    WScript.Echo IEnv
Next

-1
这对我有效:
Dim objNetwork
Set objNetwork = CreateObject("WScript.Network")
MsgBox objNetwork.UserName

或者从Shell中:

Set wshShell = WScript.CreateObject( "WScript.Shell" )
strUserName = wshShell.ExpandEnvironmentStrings( "%USERNAME%" )

或者从环境变量中获取(应该可以工作,但当我测试时出错了!):

Set WshShell = CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment
MsgBox "USERNAME=" & WshEnv.Item("USERNAME")

2
CreateObject("WScript.Network")返回的对象并不提供通用的环境变量访问,它只是将3个值作为属性公开,这些属性也反映在环境变量中:ComputerNameUserDomainUserName。你的最后一个示例无法工作的原因是WshShell.EnvironmentWshShell.Environment("System")相同,并且%USERNAME%未在系统范围内定义。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接