2010-09-17 41 views
7

Tengo un archivo por lotes que llama a un archivo vbscript. Estoy intentando que el archivo vbscript cambie una variable de entorno que luego se usa en el archivo por lotes que llama al archivo vbscript.Cómo establecer las variables de entorno en vbs que se pueden leer en el script por lotes de llamada

Aquí hay fragmentos de los archivos.

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" 

Respuesta

5

no se puede. Un proceso puede pasar variables de entorno a procesos secundarios, pero no a su elemento primario, y en este caso el elemento principal es cmd.exe, que ejecuta el archivo Parent.bat.

Por supuesto, existen otras maneras de volver a enviar la información al archivo de proceso por lotes principal: la salida a stdout o un archivo es una forma obvia, p.

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

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

Solo para agregar: El elemento secundario no puede modificar el entorno del elemento primario, sin que el elemento primario lo permita al utilizar scripts adicionales en el lado principal. Imagine qué cosas desagradables se pueden hacer si el niño puede modificar el entorno de los padres. Entonces, la respuesta corta es que child no puede modificar el entorno de los padres ** en cualquier escenario de subproceso de proceso **. – anishsane

0

No creo que pueda hacer esto. Al menos, tendría que meterse con el bloque de entorno en el proceso de llamada, y no hay garantía de que respete esto ...

2

sí, puede ... sin embargo, tendrá que restablecer en tu sesión ver el siguiente enlace:

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 

Esto es cómo lo hice:

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

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

Luego, en una secuencia de comandos VB separada (resetvars.vbs) Llamé desde el script de CMD:

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

Ho acerca de esto:

@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 

No es escritura de la hornada puro, pero funciona bien.

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 
Cuestiones relacionadas