Как установить переменные среды в VBS, которые могут быть прочитаны при вызове пакетного скрипта - PullRequest
11 голосов
/ 17 сентября 2010

У меня есть командный файл, который вызывает файл VBScript.Я пытаюсь, чтобы файл vbscript изменил переменную среды, которая позже используется в пакетном файле, который вызывает файл vbscript.

Вот фрагменты из этих файлов.

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 ]

6 голосов
/ 17 сентября 2010

Вы не можете.Процесс может передавать переменные среды дочерним процессам, но не своему родительскому процессу, и в этом случае родительским файлом является cmd.exe, на котором выполняется файл Parent.bat.информация обратно в родительский пакетный файл - вывод в stdout или файл является очевидным способом, например

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

== Parent.cmd ===
for /f "tokens=*" %%i in ('cscript //nologo child.vbs') do set Value=%%i
echo %Value%
2 голосов
/ 15 марта 2012

да, вы можете .... однако вам придется сбросить переменные в вашей сессии. см. следующую ссылку:

Существует ли команда для обновления переменных среды из командной строки в 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 голосов
/ 23 октября 2014
@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
0 голосов
/ 10 июня 2014

Но об этом:

@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 голосов
/ 17 сентября 2010

Я не думаю, что вы можете сделать это. По крайней мере, вам нужно будет связываться с блоком среды в вызывающем процессе, и нет никаких гарантий, что он будет уважать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...