如何在vbs中设置可以在调用批处理脚本中读取的环境变量
Posted
技术标签:
【中文标题】如何在vbs中设置可以在调用批处理脚本中读取的环境变量【英文标题】:How to set environment variables in vbs that can be read in calling batch script 【发布时间】:2011-04-13 20:33:25 【问题描述】:我有一个调用 vbscript 文件的批处理文件。我正在尝试让 vbscript 文件更改一个环境变量,该环境变量稍后在调用 vbscript 文件的批处理文件中使用。
这里是文件中的 sn-pes。
父.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"
【问题讨论】:
【参考方案1】:你不能。进程可以将环境变量传递给子进程,但不能传递给它的父进程——在这种情况下,父进程是 cmd.exe,它正在运行您的 Parent.bat 文件。
当然还有其他方式可以将信息传递回父批处理文件 - 输出到标准输出或文件是一种显而易见的方式,例如
== Child.vbs ===
WScript.echo "New Value"
== Parent.cmd ===
for /f "tokens=*" %%i in ('cscript //nologo child.vbs') do set Value=%%i
echo %Value%
【讨论】:
只是补充:孩子不能修改父母的环境,没有父母允许它在父母端使用额外的脚本。想象一下,如果孩子可以修改父母的环境,会发生什么令人讨厌的事情。所以简短的回答是孩子不能修改父母的环境在任何流程子流程场景。【参考方案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"
然后在我从 CMD 脚本调用的单独 VB 脚本 (resetvars.vbs) 中:
cscript //nologo \\%APPSERVER%\apps\IE9.0\restartvars.vbs
call %TEMP%\resetvars.bat
【讨论】:
【参考方案3】:我认为你做不到。至少,您需要在调用过程中弄乱环境块,并且不能保证它会尊重这一点......
【讨论】:
【参考方案4】:关于这个:
@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
这不是纯批处理脚本,但可以正常工作。
【讨论】:
【参考方案5】:@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
【讨论】:
以上是关于如何在vbs中设置可以在调用批处理脚本中读取的环境变量的主要内容,如果未能解决你的问题,请参考以下文章