2010-08-05 9 views
8

मुझे आशा है कि शीर्षक संक्षिप्त है, लेकिन सिर्फ मामले में:बैच से PowerShell को कॉल करना, और स्क्रिप्ट में अस्थायी वातावरण परिवर्तनीय सेट के नए मान को पुनर्प्राप्त करना?

मैं एक बैच फ़ाइल से एक PowerShell स्क्रिप्ट बोल रहा हूँ। मैं PowerShell स्क्रिप्ट को पर्यावरण चर के मान को सेट करने के लिए चाहता हूं, और PowerShell स्क्रिप्ट समाप्त होने पर उस नए मान को बैच फ़ाइल में उपलब्ध होना चाहिए।

मुझे पता है कि PowerShell में $ env का उपयोग करके पर्यावरण चर सेट करना संभव है, लेकिन PowerShell स्क्रिप्ट समाप्त होने पर मान जारी नहीं रहता है। मुझे लगता है कि यह शायद इसलिए है क्योंकि PowerShell को एक अलग प्रक्रिया में निष्पादित किया जाता है।

मुझे पता है कि मैं एक निकास कोड वापस कर सकता हूं और% ErrorLevel% का उपयोग कर सकता हूं, लेकिन यह केवल मुझे संख्या देगा, और एक संघर्ष होगा, क्योंकि 1 उपयोगी संख्या के बजाय PowerShell अपवाद को इंगित करता है।

अब, यहां चेतावनी है: मैं पर्यावरण चर को जारी रखना नहीं चाहता हूं। यही है, मैं नहीं चाहता कि इसे उपयोगकर्ता या सिस्टम के लिए परिभाषित किया जाए, और इसलिए मैं बैच फ़ाइल से बाहर निकलने के बाद इसे अनुपलब्ध होना चाहता हूं। आखिरकार, मैं केवल PowerShell स्क्रिप्ट से कॉलिंग बैच फ़ाइल में परिणामों को संवाद करना चाहता हूं।

क्या यह संभव है?

अग्रिम धन्यवाद :)

निक

उत्तर

-1

PowerShell से परिणाम पर कब्जा करने के लिए सबसे सीधे आगे रास्ता PowerShell में stdout उपयोग करने के लिए है। उदाहरण के लिए, इस cmd.exe में घ env वर के लिए तारीख की बचत होती है

set d = powershell -noprofile "& { get-date }" 
+0

अच्छा समाधान। मुझे संदेह है कि कोई दूसरा ऐसा है जो इतना आसान और सीधा है। – stej

+2

प्रतिक्रिया के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि उपर्युक्त काम करेगा? इस मामले में मैं क्या होने की उम्मीद करूंगा कि पर्यावरण चर 'डी' का मूल्य 'powerhell -noprofile' और {get-date} "होगा। आईई: अभिव्यक्ति के दाहिने तरफ की सामग्री का मूल्यांकन नहीं किया जाता है। –

+0

@ निकोलस, आप सही हैं। मैंने अभी कोशिश की है और वास्तव में चर में केवल स्ट्रिंग संग्रहित है। – stej

10

काम करने के लिए stdout का उपयोग कर, तो आप इस तरह अपने बैच स्क्रिप्ट से powershell आह्वान कर सकते हैं की कीथ के विचार प्राप्त करने के लिए:

FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v" 

थोड़ा अजीब है, लेकिन यह काम करता है:

C:\>FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v" 
C:\>set d 
d=August 5, 2010 11:04:36 AM 
+1

इसके अलावा, यदि आप बैच फ़ाइल में इस कोड को चला रहे हैं और कमांड लाइन से नहीं हैं, तो आपको उपर्युक्त उदाहरण में दोनों जगहों पर% v से %% v में परिवर्तन करने के लिए आपको अपने चर नाम के सामने डबल प्रतिशत संकेतों का उपयोग करना होगा)। – deadlydog

+0

यदि आप अधिक जानकारी चाहते हैं, तो आप उन्हें https://blogs.msdn.microsoft.com/oldnewthing/20120731-00/?p=7003 पर देख सकते हैं – Arithmomaniac

0

मैं जानता हूँ कि यह एक छोटे इस सवाल का जवाब करने के लिए देर सा है, लेकिन मैं यह एक कोशिश सिर्फ मामले में किसी भी एक अधिक विस्तृत समाधान की जरूरत है देने के लिए करना चाहते हैं। तो, यह यहाँ चला जाता है।

set psCmd="&{ Write-Host 'You got it';}" 
call :RunPS %psCmd% RetValue 
echo %RetValue% 

हो जाएगा ताकि: इसका इस्तेमाल करने

:: A function that would execute powershell script and return a value from it. 
:: <PassPSCMD> pass the powreshell command, notice that you need to add any returning value witth Write-Host 
:: <RetValue> the returned value 
:RunPS <PassPSCMD> <RetValue> 
    Powershell Set-ExecutionPolicy RemoteSigned -Force 
    for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i 
    set "%2=%returnValue%" 
Goto:eof 
:: End of :RunPS function 

अब, एक उदाहरण के रूप:

मैं एक बैच समारोह है कि आप के लिए ps स्क्रिप्ट को निष्पादित और एक मूल्य वापसी होगी, कुछ इस तरह बनाया कंसोल स्क्रीन पर प्रदर्शित करें आपको यह मिला

एक अधिक जटिल उदाहरण के रूप में, मैं जोड़ता हूं:

मान लेते हैं कि हम अगर एक वीएम ऊपर या नीचे है की जाँच करना चाहते हैं, जिसका अर्थ है यदि उस पर या बंद है, इसलिये हम क्या कर सकते हैं निम्नलिखित:

:CheckMachineUpOrDown <returnResult> <passedMachineName> 
    set userName=vCenterAdministratorAccount 
    set passWord=vCenterAdminPW 
    set vCenterName=vcenter.somedmain.whatever 
    set psCmd="&{Add-PSSnapin VMware.VimAutomation.Core; Connect-VIServer -server %%vCenterName%% -User %userName% -Password %passWord%; $vmServer = Get-VM %2;Write-Host ($vmServer.PowerState -eq 'PoweredOn')}" 

    call :RunPS %psCmd% RetValue 
    if "%RetValue%" EQU "True" (set "%1=Up") else (set "%1=Down") 
Goto:eof 

:: A function that would execute powershell script and return a value from it. 
:: <PassPSCMD> pass the powreshell command, notice that you need to add any returning value witth Write-Host 
:: <RetValue> the returned value 
:RunPS <PassPSCMD> <RetValue> 
    Powershell Set-ExecutionPolicy RemoteSigned -Force 
    for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i 
    set "%2=%returnValue%" 
    Goto:eof 
:: End of :RunPS function 

अब, कैसे उपयोग करने के लिए: CheckMachineUpOrDown समारोह?

सिर्फ इस उदाहरण का पालन करें:

set Workstation=MyVMName 
call :CheckMachineUpOrDown VMStatus %Workstation% 
echo %VMStatus% 

यह ऊपर प्रदर्शित करेगा अगर वी एम पर या नीचे संचालित है, तो मशीन बंद है।

आशा है कि यह सहायक होगा।

धन्यवाद

संबंधित मुद्दे