2010-09-17 7 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

आप नहीं कर सकते। एक प्रक्रिया बाल प्रक्रियाओं में पर्यावरण चर को पारित कर सकती है, लेकिन इसके माता-पिता के लिए नहीं - और इस मामले में माता-पिता 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% 
+1

बस जोड़ने के लिए: बच्चा माता-पिता के पर्यावरण को संशोधित नहीं कर सकता, बिना माता-पिता को पैरेंट पक्ष पर अतिरिक्त स्क्रिप्टिंग का उपयोग करने की अनुमति देता है। कल्पना करें कि अगर बच्चे माता-पिता के पर्यावरण को संशोधित कर सकता है तो क्या बुरा काम किया जा सकता है। इतना छोटा जवाब यह है कि बच्चे माता-पिता के पर्यावरण को संशोधित नहीं कर सकता ** किसी भी प्रक्रिया-सबप्रोसेस परिदृश्य में **। – anishsane

0

मुझे नहीं लगता कि आप यह कर सकते हैं। कम से कम, आपको कॉलिंग प्रक्रिया में पर्यावरण ब्लॉक के साथ गड़बड़ करने की आवश्यकता होगी, और इसकी कोई गारंटी नहीं है कि यह इसका सम्मान करेगा ...

2

हाँ, आप कर सकते हैं .... हालांकि, आपको रीसेटवर्स करना होगा आपका सत्र नीचे दिए गए लिंक देखें:

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

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

तो एक अलग वीबी लिपि में (resetvars.vbs):

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 

इस तरह मैंने किया मैंने सीएमडी स्क्रिप्ट से कहा:

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 
संबंधित मुद्दे