2012-08-31 30 views
1
  • 我有我的设置环境变量的批处理文件:setenv.bat
  • 我想使用setenv.bat在VB脚本,以设置我的变量

综上所述,我的VBS启动了setenv.bat,然后它使用了setenv.bat中指定的环境变量。VBS推出了一批即设置environement变量

可能吗?

回答

-1

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

你能以其他方式做到吗?从你的.bat文件调用你的VB脚本?

+0

要的人谁低估了我,你真的测试过吗?我做了,我的回答站立。如果我错了,请告诉我如何。 – aphoria

+0

不幸的是,我不能在我的蝙蝠内呼叫我的VBS。我会找到另一种方式来做到这一点。非常感谢你的答案。 – user1638320

+0

如果此答案(或其他答案)回答了您的问题,请点击左侧的复选标记以通过答案并接受答案作为答案。 – aphoria

-1

是的,您可以访问任何环境变量,其中包含“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%。)

+0

这很棒,但这不是OP要求的。他想运行他的VB脚本并调用setevn.bat,然后访问批处理文件中设置的环境变量,这是不可能的。 – aphoria

1

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 "" 
+0

你对'SETX'说得对。唯一需要注意的是'SETX'不能删除环境变量AFAIK。如果您不希望环境变量永久挂起,则必须从注册表中删除该变量。你可以使用'REG.EXE'或让VB脚本来做。 – aphoria

+0

@aphoria:'SETX varname“”'为我工作。 –

+0

你对删除是正确的。该帮助没有说明如何去做,我公认的简短的研究没有改变任何事情。我在Windows 7上注意到,除非以管理员身份运行命令提示符,否则“SETX”不起作用。 – aphoria