【发布时间】:2012-08-31 09:56:14
【问题描述】:
- 我有一个设置环境变量的批处理文件:setenv.bat
- 我想在 VB 脚本中使用 setenv.bat 来设置我的变量
总结一下,我的 VBS 启动 setenv.bat,然后它使用 setenv.bat 中指定的环境变量。
有可能吗?
【问题讨论】:
标签: batch-file vbscript environment-variables
总结一下,我的 VBS 启动 setenv.bat,然后它使用 setenv.bat 中指定的环境变量。
有可能吗?
【问题讨论】:
标签: batch-file vbscript environment-variables
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 脚本执行此操作。
SETX 不起作用,除非我以管理员身份运行命令提示符。
不,这不起作用。当您的 VB 脚本运行 setevn.bat 时,.bat 文件在其自己的进程中运行,因此您设置的任何环境变量都不会被您的 VB 脚本访问。
你可以换一种方式吗?从您的 .bat 文件中调用您的 VB 脚本?
【讨论】:
是的,您可以访问任何环境变量,但不包括 %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% 除外。)
【讨论】:
setevn.bat,然后访问批处理文件中设置的环境变量,这是不可能的。