【问题标题】:VBS launch a batch which set the environement variablesVBS 启动一个设置环境变量的批处理
【发布时间】:2012-08-31 09:56:14
【问题描述】:
  • 我有一个设置环境变量的批处理文件:setenv.bat
  • 我想在 VB 脚本中使用 setenv.bat 来设置我的变量

总结一下,我的 VBS 启动 setenv.bat,然后它使用 setenv.bat 中指定的环境变量。

有可能吗?

【问题讨论】:

    标签: batch-file vbscript environment-variables


    【解决方案1】:

    Aphoria 是对的。当您从 VBS 运行批处理文件时,将启动 cmd 的单独副本,这意味着批处理文件在其自己的环境中执行。一旦批处理文件(或更准确地说,运行该批处理的cmd 进程)终止,该环境就会丢失。因此,该批处理文件所做的任何变量分配都会变成“本地”的。

    但是,这并不意味着您根本无法实现您想要的。您需要一种分配值的方法,以便在不同的cmd 会话中保留它们。 有一个命令可以做到这一点,它是SETX。它允许您创建/修改“全局”环境变量,该变量不仅在不同的 cmd 会话中持续存在,而且在 Windows 会话中也存在。

    该命令的语法与SET类似,只是变量名和值之间没有=字符:

    SETX variable value
    

    如果值包含空格(或特殊字符),请将其括在双引号中(请注意,在分配值时它们会被删除)。 SETX 有一些选项,您可以通过阅读内置帮助来学习,只需在命令提示符下运行 SETX /?,但这对于您的情况应该足够了。

    关于SETX 的另一件事似乎与您的情况并不相关,但对于未来可能仍然值得牢记,那就是,奇怪的是,SETX 所做的分配没有反映在分配发生的cmd 会话中。 (事实上​​,它不会反映在当时任何活动的 cmd 会话中。)也就是说,根据您的情况,您将无法读取使用 SETX 分配它们的同一批处理文件中的新值.但是在运行(并等待完成)批处理文件之后,您当然可以在 VBS 中读取它们。

    所以,这里有一个测试设置来演示它是如何工作的:

    • setenv.bat:

      SETX testvar1 123
      
    • test.vbs:

      Set objShell = WScript.CreateObject("WScript.Shell")
      Set objUserEnv = objShell.Environment("User")
      
      ' show the value before running the batch script
      WScript.Echo "1. testvar1=" & objUserEnv("testvar1")
      
      ' set the environment with the batch file
      objShell.Run "setenv.bat", 1, true
      
      ' show the value again to see the effect
      WScript.Echo "2. testvar1=" & objUserEnv("testvar1")
      

    更新

    如果您的某些变量作为setenv.bat 的一部分被未定义(或删除,如SET variable=),这就是您使用@ 的方式987654341@:

    SETX variable ""
    

    【讨论】:

    • 您对SETX 的看法是正确的。唯一需要注意的是SETX 无法删除环境变量,AFAIK。如果您不希望环境变量永久存在,则必须从注册表中删除。您可以使用 REG.EXE 或让 VB 脚本执行此操作。
    • 删除是正确的。帮助没有说明如何做到这一点,而且我公认的简短研究没有发现任何问题。我确实注意到在 Windows 7 上,SETX 不起作用,除非我以管理员身份运行命令提示符。
    【解决方案2】:

    不,这不起作用。当您的 VB 脚本运行 setevn.bat 时,.bat 文件在其自己的进程中运行,因此您设置的任何环境变量都不会被您的 VB 脚本访问。

    你可以换一种方式吗?从您的 .bat 文件中调用您的 VB 脚本?

    【讨论】:

    • 致对我投反对票的人,你真的测试过这个吗?我做到了,我的答案是成立的。如果我错了,请告诉我怎么做。
    • 不幸的是,我无法在我的球棒内调用我的 VBS。我会找到另一种方法来做到这一点。非常感谢两位的回答。
    • 如果这个(或另一个)答案回答了您的问题,请点击左侧的复选标记投票并接受它作为答案。
    【解决方案3】:

    是的,您可以访问任何环境变量,但不包括 %time% 和 %date% 等“伪环境变量”。

    我创建了一个批处理文件和一个交互的 vbs 文件:

    k.bat

    @echo off
    
    :: Setting ERRORLEVEL to 0
    DIR *.* > NUL
    
    :: Display current ErrorLevel
    echo ErrorLevel=%errorlevel%
    
    :: Creating a variable for the VBS file to see
    set VBS=Can you see me?
    
    echo.
    echo Entering VBS
    echo =============================
    cscript /nologo k.vbs
    echo =============================
    echo Exited VBS
    echo.
    
    echo ErrorLevel=%errorlevel%
    echo Test=%Test%
    echo Test2=%Test2%
    ECHO VBS=%VBS%
    goto :eof
    

    k.vbs

    Set wshShell = CreateObject( "WScript.Shell" )
    
    ' Store the EV %PATH% in var1
    var1 = "PATH = " & wshShell.ExpandEnvironmentStrings( "%PATH%" )
    
    ' Print var1
    wscript.echo var1
    wscript.echo
    
    ' Getting Ready to Create / Set an EV (In Vista and Above you cannot 
    ' set "SYSTEM" variables.
    Set wshUserEnv = wshShell.Environment( "USER" )
    Set wshSystemEnv = wshShell.Environment( "SYSTEM" )
    
    ' Another method of retrieving an EV that takes advantage of wshShell.Environment
    ' Get value of %Test%
    WScript.Echo "Test=" & wshUserEnv( "Test" )
    
    ' Set EV %Test%
    wshUserEnv( "Test" ) = "VBS Can set Environmental Variables"
    
    ' Print out the value of %Test%
    WScript.Echo "Test=" & wshUserEnv( "Test" )
    
    'Both methods are not created equilly
    WScript.Echo "1 VBS=" & wshUserEnv( "VBS" )
    wscript.echo "2 VBS = " & wshShell.ExpandEnvironmentStrings( "%VBS%" )
    
    ' Overwrite %VBS%
    wshUserEnv( "VBS" ) = ""
    
    WScript.Echo "3 VBS=" & wshUserEnv( "VBS" )
    WScript.Echo "4 VBS=" & wshSystemEnv( "VBS" )
    wscript.echo "5 VBS = " & wshShell.ExpandEnvironmentStrings( "%VBS%" )
    
    
    ' In Vista and up, VBS cannot delete an EV it did not create
    wshUserEnv.Remove( "VBS" )
    
    ' Delete Variable %Test%
    wscript.echo "Deleting Test"
    wshUserEnv.Remove( "Test" )
    
    ' Show variable %Test% again, using first method
    wscript.echo "TEST = " & wshShell.ExpandEnvironmentStrings( "%Test%" )
    WScript.Echo "Test=" & wshUserEnv( "Test" )
    
    ' Create one last varible for the batch file to check
    wshUserEnv( "Test2" ) = "Yes you can!"
    WScript.Echo "Test2=" & wshUserEnv( "Test2" )
    
    ' Set the ERRORLEVEL to 99
    wscript.quit 99
    

    我的输出(我已经剪掉了 %PATH% 的大部分内容,但它确实显示了属性。)

    Output:

    VBS=
    ErrorLevel=0
    VBS= 2:39:46.02
    
    Entering VBS
    =============================
    PATH = c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE;c
     Visual Studio 9.0\Common7\Tools;c:\Windows\Microsoft.NET\Framework\v3.
    tudio 9.0\VC\VCPackages;C:\Program Files\\Microsoft SDKs\Windows\v6.0A\
     Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live
    Shell\v1.0\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;
    d++\;C:\Program Files (x86)\Android\android-sdk\tools;C:\Program Files
    (x86)\Lua\5.1\clibs;C:\Program Files\Java\jre7\bin\msvcr100.dll;C:\Prog
    indows NT\Accessories\;C:\Program Files (x86)\Windows Live\Shared;C:\Pr
    w64;C:\Program Files (x86)\Common Files\Ulead Systems\MPEG;D:\Program F
    
    Test=
    Test=VBS Can set Environmental Variables
    1 VBS=
    2 VBS =  2:39:46.02
    3 VBS=
    4 VBS=
    5 VBS =  2:39:46.02
    Deleting Test
    TEST = %Test%
    Test=
    Test2=Yes you can!
    =============================
    Exited VBS
    
    ErrorLevel=99
    Test=
    Test2=
    VBS= 2:39:46.02
    

    因此,如您所见,批处理文件可以使用环境变量将数据发送到 VBS 脚本,并且该脚本可以读取这些变量并对其进行操作。但是,除了%ERRORLEVEL%,VBS 脚本不能更改或添加变量供批处理文件查看和使用。

    这是因为 VBS 脚本是使用批处理文件使用的环境的副本启动的,因此当它将控制权返回给调用批处理文件时,该环境会消失并且原始环境中的变量环境从未改变。 (同样,%ERRORLEVEL% 除外。)

    【讨论】:

    • 这一切都很好,但这不是 OP 所要求的。他想运行他的 VB 脚本并让它调用setevn.bat,然后访问批处理文件中设置的环境变量,这是不可能的。
    猜你喜欢
    • 2018-08-08
    • 2023-03-09
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多