- 我有我的设置环境变量的批处理文件:setenv.bat
- 我想使用setenv.bat在VB脚本,以设置我的变量
综上所述,我的VBS启动了setenv.bat,然后它使用了setenv.bat中指定的环境变量。VBS推出了一批即设置environement变量
可能吗?
综上所述,我的VBS启动了setenv.bat,然后它使用了setenv.bat中指定的环境变量。VBS推出了一批即设置environement变量
可能吗?
不,这是行不通的。当您的VB脚本运行setevn.bat
时,.bat文件将在其自己的进程中运行,因此您设置的任何环境变量都不会被VB脚本访问。
你能以其他方式做到吗?从你的.bat文件调用你的VB脚本?
是的,您可以访问任何环境变量,其中包含“psudo”环境变量,如%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,然后访问批处理文件中设置的环境变量,这是不可能的。 – aphoria
Aphoria是正确的。从VBS运行批处理文件时,将启动cmd
的单独副本,这意味着批处理文件在其自己的环境中执行。只要批处理文件(或更准确地说,运行该批处理的进程)终止,该环境就会丢失。因此,该批处理文件所做的任何变量赋值都会对其“本地”生效。
但是,这并不意味着,你根本无法达到你想要的。您需要一种方法来分配值,以便在不同的cmd
会话中保留它们。并且是这样做的命令,它是SETX
。它允许您创建/修改“全局”环境变量,该变量不仅跨越不同的cmd
会话,而且跨Windows会话持续存在。
该命令的语法是类似的SET
,只有有变量名和值之间没有=
字符:
SETX variablevalue
如果值包含空格(或特殊字符),它括在双引号(请注意,当值被赋值时它们被删除)。有一些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")
UPDATE
如果某些变量正在未定义(或删除,在SET variable=
)作为setenv.bat
一部分,这是如何做到这一点使用SETX
:
SETX variable ""
要的人谁低估了我,你真的测试过吗?我做了,我的回答站立。如果我错了,请告诉我如何。 – aphoria
不幸的是,我不能在我的蝙蝠内呼叫我的VBS。我会找到另一种方式来做到这一点。非常感谢你的答案。 – user1638320
如果此答案(或其他答案)回答了您的问题,请点击左侧的复选标记以通过答案并接受答案作为答案。 – aphoria