1
  • 我有一个设置我的环境变量的批处理文件:setenv.bat
  • 我想在 VB 脚本中使用 setenv.bat 来设置我的变量

综上所述,我的 VBS 启动 setenv.bat,然后它使用 setenv.bat 中指定的环境变量。

可能吗?

4

3 回答 3

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")
    

更新

如果您的某些变量未定义(或已删除,如 中SET variable=)作为 的一部分setenv.bat,您可以使用以下方法执行此操作SETX

SETX variable ""
于 2012-09-04T09:00:28.223 回答
-1

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

你能用其他方法吗?从您的 .bat 文件中调用您的 VB 脚本?

于 2012-08-31T20:03:38.943 回答
-1

是的,您可以访问任何环境变量,但不包括 %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%.)

于 2012-09-01T06:46:49.353 回答