总而言之,我的VBS启动setenv.bat,然后它使用setenv.bat中指定的环境变量。
有可能吗?
答案 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%
除外。)