VBS启动一个设置环境变量的批处理

时间:2012-08-31 09:56:14

标签: batch-file vbscript environment-variables

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

总而言之,我的VBS启动setenv.bat,然后它使用setenv.bat中指定的环境变量。

有可能吗?

3 个答案:

答案 0 :(得分:1)

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

然而,这并不意味着你根本无法实现你想要的东西。您需要一种方法来分配在不同cmd个会话中保留它们的值。 一个执行该操作的命令,它是SETX。它允许您创建/修改“全局”环境变量,该变量不仅可以在不同的cmd会话中持续存在,还可以在Windows会话中持续存在。

命令的语法类似于SET的语法,只是变量名称及其值之间没有=个字符:

SETX variable value

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

关于SETX的另一件事,在你的情况下看起来并不真实,但对于未来可能仍然值得记住,奇怪的是,由SETX做出的任务未在作业分配的cmd会话中反映出来。 (事实上​​,它并没有反映在当时活动的任何cmd会话中。)也就是说,适用于您的情况,您将无法读取使用{{1}分配它们的同一批处理文件中的新值。 }}。但是,在运行(并等待完成)批处理文件后,您肯定能够在VBS中读取它们。

所以,这是一个测试设置,用于演示其工作原理:

  • SETX

    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

答案 1 :(得分:-1)

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

你能用另一种方式吗?从.bat文件中调用VB脚本?

答案 2 :(得分:-1)

是的,您可以访问任何环境变量,并删除'psudo-environment变量,如%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%除外。)