2010-09-17 224 views
7

我有一个调用vbscript文件的批处理文件。我正在尝试让vbscript文件更改一个环境变量,该变量稍后在调用vbscript文件的批处理文件中使用。如何在调用批处理脚本中设置vbs中的环境变量

这里是文件的片段。

Parent.bat

Set Value="Initial Value" 
cscript Child.vbs 
ECHO Value = %VALUE% 

Child.vbs

Set wshShell = CreateObject("WScript.Shell") 
Set wshSystemEnv = wshShell.Environment("Process") 
wshSystemEnv("VALUE") = "New Value" 

回答

5

你不能。进程可以将环境变量传递给子进程,但不传递给父进程 - 在这种情况下,父进程是运行Parent.bat文件的cmd.exe。

当然还有其他方法可以将信息传回母批处理文件 - 输出到标准输出或文件是一种明显的方式,例如,

== Child.vbs === 
WScript.echo "New Value" 

== Parent.cmd === 
for /f "tokens=*" %%i in ('cscript //nologo child.vbs') do set Value=%%i 
echo %Value% 
+1

只是要添加:孩子不能修改父级的环境,没有父级允许它在父级使用额外的脚本。想象一下,如果孩子可以修改父母的环境,会发生什么令人讨厌的事情。所以简短的回答是,在任何过程 - 子过程场景**中,孩子不能修改父母的环境**。 – anishsane 2012-11-17 04:44:27

0

我不认为你可以这样做。至少,你需要在调用过程中弄乱环境块,并且不能保证它会尊重这个...

2

是的,你可以....但是,你必须重置你的会议。请访问以下链接:

Is there a command to refresh environment variables from the command prompt in Windows?

“RESETVARS.vbs

Set oShell = WScript.CreateObject("WScript.Shell") 
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat") 
Set objFileSystem = CreateObject("Scripting.fileSystemObject") 
Set oFile = objFileSystem.CreateTextFile(filename, TRUE) 

set oEnv=oShell.Environment("System") 
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem) 
next 
path = oEnv("PATH") 

set oEnv=oShell.Environment("User") 
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem) 
next 

path = path & ";" & oEnv("PATH") 
oFile.WriteLine("SET PATH=" & path) 
oFile.Close 

这是我做的:

SET oShell = CREATEOBJECT("Wscript.Shell") 
dim varSet 
SET varSet = NOTHING 

    SET varSet = oShell.Environment("SYSTEM") 
    varSet("WinVer") = "6.0.2008" 

然后在一个单独的VB脚本(resetvars.vbs)我从CMD脚本中调用:

cscript //nologo \\%APPSERVER%\apps\IE9.0\restartvars.vbs 
call %TEMP%\resetvars.bat 
0

何一下:

@echo off 
set vbsFile=%temp%\createguid.vbs 
call :CreateVbs 
call :GetGuid NewGuid 
echo.%NewGuid% 
del %vbsFile%>nul 
GOTO:EOF 

:CreateVbs 
echo.set obj = CreateObject("Scriptlet.TypeLib")>%vbsFile% 
echo.WScript.StdOut.WriteLine obj.GUID>>%vbsFile% 
GOTO:EOF 

:GetGuid 
for /f "tokens=*" %%i in ('cscript //nologo %vbsFile%') do set %1=%%i 
GOTO:EOF 

它不是纯粹的批处理脚本,但工程确定。

0
@echo off&color 4a&title %~n0&AT>NUL 
IF %ERRORLEVEL% EQU 0 (
    goto 2 
) ELSE (
    echo. 
) 
if not "%minimized%"=="" goto 1 
set minimized=true & start /min cmd /C "%~dpnx0"&cls&exit 
:1 
wmic process where name="cmd.exe" CALL setpriority "realtime">nul&echo set shell=CreateObject("Shell.Application") > %~n0.vbs&echo shell.ShellExecute "%~dpnx0",,"%CD%", "runas", 1 >> %~n0.vbs&echo set shell=nothing >> %~n0.vbs&start %~n0.vbs /realtime&timeout 1 /NOBREAK>nul& del /Q %~n0.vbs&cls&exit 
:2 
echo %~dpnx0 admin mode look up&wmic process where name="cmd.exe" CALL setpriority "realtime"&timeout 3 /NOBREAK>nul 
:3 
echo x=msgbox("end of line" ,48, "%~n0") > %~n0.vbs&start %~n0.vbs /realtime&timeout 1 /NOBREAK>nul& del /Q %~n0.vbs&cls&exit