2010-09-17 13 views
7

Ich habe eine Batch-Datei, die eine VBScript-Datei aufruft. Ich versuche, die VBScript-Datei ändern eine Umgebungsvariable, die später in der Batch-Datei verwendet wird, die die VBScript-Datei aufruft.Wie Sie Umgebungsvariablen in Vbs festlegen, die beim Aufruf von Batch-Skript gelesen werden können

Hier sind Schnipsel aus den Dateien.

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" 

Antwort

5

Sie können nicht. Ein Prozess kann Umgebungsvariablen an untergeordnete Prozesse übergeben, jedoch nicht an den übergeordneten Prozess. In diesem Fall lautet der übergeordnete Parameter "cmd.exe", in dem die Datei "Parent.bat" ausgeführt wird.

Es gibt natürlich andere Möglichkeiten, um Informationen zurück zu der übergeordneten Batch-Datei zu kommunizieren - Ausgabe auf stdout oder eine Datei ist ein naheliegender Weg, z.B.

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

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

Nur hinzufügen: Das Kind kann die Umgebung der Eltern nicht ändern, ohne Eltern erlaubt es mit zusätzlichen Skripten auf der Elternseite. Stellen Sie sich vor, welche unangenehmen Dinge passieren können, wenn das Kind die Umgebung der Eltern ändern könnte. So kurze Antwort ist Kind kann nicht die Umgebung der Eltern ** in jedem Prozess-Subprozess-Szenario ** ändern. – anishsane

0

Ich glaube nicht, dass Sie das tun können. Zumindest müssten Sie sich mit dem Umgebungsblock im aufrufenden Prozess herumschlagen, und es gibt keine Garantie dafür, dass dies eingehalten wird ...

2

Ja, Sie können ... aber Sie müssen Vars zurücksetzen deine Sitzung. siehe den folgenden Link:

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 

Dies ist, wie ich es tat:

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

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

dann in einem separaten VB-Skript (resetvars.vbs) Ich rief von CMD Skript:

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

Ho dazu:

@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 

Es ist nicht reine Batch-Skript funktioniert, ist aber ok.

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 
Verwandte Themen