2011-05-23 9 views
5

यह एक छोटा लगता है लेकिन उत्तर ने मुझे कुछ दिनों के लिए हटा दिया है।कॉलिंग प्रक्रिया के पर्यावरण चर बदलना

मेरे पास एक विंडोज बैच फ़ाइल है, जो एक सी # प्रोग्राम को एक अतिरिक्त सत्यापन करने के लिए कहते हैं जो बैच फ़ाइल में नहीं किया जा सकता है। सत्यापन पूर्ण होने के बाद मुझे कॉलिंग खोल पर एक स्थिति और एक स्ट्रिंग वापस करने की आवश्यकता है।

अब वापसी मूल्य छोटा है और मेरा सी # कंसोल ऐप बस एक वापसी मूल्य सेट करता है (अगर आप चाहते हैं तो निकास कोड)। और मैंने सोचा कि स्ट्रिंग भी केक का टुकड़ा होगा। - कि बहुत सी # प्रक्रिया है कि चर बनाया है

Environment.SetEnvironmentVariable("ERR", "Some text"); 

इस कॉल करना चाहिए (और करता है) मौजूदा प्रक्रिया भीतर एक खोल चर को परिभाषित: मैं एक नया खोल चर का उपयोग कर परिभाषित करने का प्रयास। जैसे ही सी # ऐप समाप्त हो जाता है और सी # ऐप बनाया गया खोल वैरिएबल के बारे में कुछ भी नहीं जानता है। तो ... किसी विशेष उपयोग के साथ एक कॉल ... बिलकुल नहीं ... जब तक मैंने सी 3 ऐप से बाल प्रक्रिया नहीं बनाई है, तो शायद यह मेरे चर का वारिस करेगा।

पर्यावरणवृत्त लक्ष्य। माचिन और पर्यावरण VariableTarget.Eser लक्ष्य SetEnvironmentVariable कॉल के लिए लक्ष्य समस्या को हल नहीं करते हैं, क्योंकि केवल एक नव निर्मित प्रक्रिया रजिस्ट्री से इन नए मानों को प्राप्त करेगी।

तो केवल काम कर समाधान मैं के बारे में सोच सकता है: वापसी मान में

  • एनकोड अतिरिक्त अर्थ एक फाइल करने के लिए
  • लिखने stdout को

    • लिखने

    पहले दो थोड़ा बदसूरत हैं और आखिरी में इसकी सीमाएं और समस्याएं हैं।

    कोई अन्य विचार (मूल प्रक्रिया में एक शैल चर सेट करने के लिए कैसे)? हो सकता है कि इस तरह के खोल चर संशोधनों

    धन्यवाद आपके समय के लिए एक सुरक्षा चिंता का विषय है (लगता पथ) कर रहे हैं ...।

  • उत्तर

    0

    मेरा बीएटी थोड़ा जंगली है, लेकिन मुझे लगता है कि %ERRORLEVEL% के माध्यम से, बाहरी रूप से चलने वाली प्रक्रियाओं से 'निकास' कोड पुनर्प्राप्त करना संभव है। अगर ऐसी बात है, तुम्हें पता है, कोई संदेश नहीं जोड़ सकते हैं ताकि आपको बस इतना करना है कि .bat फ़ाइल में होगा के माध्यम से

    Environment.Exit(123); // where 123 = error code 
    

    अपने कार्यक्रम बाहर निकलने के लिए सुनिश्चित करें।

    अगर ऐसा नहीं है, stdout शायद सबसे अच्छा तरीका है।

    +0

    वास्तव में ऐसा है। कंसोल ऐप का परिणाम आमतौर पर रिटर्न कोड के माध्यम से वापस किया जाता है। स्पष्ट रूप से 'Environment.Exit()' ढांचे पर थोड़ा मोटा है ... इसलिए एक साधारण 'वापसी x' पसंदीदा विधि है। हालांकि, मैं सोच रहा था कि क्या कोई तरीका है जहां मैं माता-पिता खोल वातावरण में ** एक और मूल्य ** धक्का दे सकता हूं। उदाहरण के लिए त्रुटि कोड 123 के स्ट्रिंग के रूप में स्पष्टीकरण ... मैं अभी stdout का उपयोग कर रहा हूं ... इसे एक फ़ाइल में रीडायरेक्ट करें, इसे वापस खोल var पर पढ़ें, फ़ाइल को हटाएं ... थोड़ा सा गंदे लेकिन यह काम करता है। – JamesH

    1

    आप बैच में एक चर में कुछ उत्पादन का एक मूल्य डाल करने के लिए आप निम्न निर्माण का उपयोग कर सकते चाहते हैं:

    6.1.7601 
    

    'usebackq' का अर्थ है: मेरे ओएस पर

    FOR /F "usebackq tokens=4 delims=\[\] " %i IN (`ver`) DO set VERSION=%i 
    ECHO %VERSION% 
    

    आउटपुट हम बैक कोट्स का उपयोग कर रहे हैं जो डबल कोट्स के साथ उद्धृत कमांड में एक फाइलसेट का उपयोग करने की क्षमता देता है। आपको इसकी आवश्यकता नहीं हो सकती है। 'टोकन' का मतलब है परिणामी स्ट्रिंग सरणी में इंडेक्स का चयन करना (यह एक श्रेणी एम-एन हो सकता है)। यदि आपको लाइनों को छोड़ना है 'skip = X')।'delims' स्ट्रिंग सेपरेटर्स का उपयोग करने के लिए हैं (जैसे .NET में स्ट्रिंग-स्प्लिट())।

    आप 'कंस' के बजाय अपना कंसोल ऐप डाल देंगे और अपने विशिष्ट आउटपुट से मेल खाने के लिए डिलीमीटर और टोकन को अनुकूलित करेंगे। यदि आपके पास भरने के लिए अधिक चर हैं तो आपको थोड़ा अधिक जटिल बनाना होगा, लेकिन इसे अच्छी शुरुआत करनी चाहिए।

    2

    आप जो पूछ रहे हैं वह एक चल रही प्रक्रिया की स्मृति स्थान को मनमाने ढंग से लिखने में सक्षम होना है। अच्छे कारण के लिए, SeDebugPrivilege के बिना यह संभव नहीं है।

    आपके द्वारा सूचीबद्ध तीन समाधानों में से कोई भी काम करेगा। स्टैडआउट बैच स्क्रिप्ट के साथ संवाद करने का मानक तरीका है।

    वैसे, आप एक विंडोज बैच फ़ाइल लिख रहे हैं। मुझे पूरा यकीन है कि जहाज पहले से ही "थोड़ा बदसूरत" पर जा चुका है।

    3

    मुझे रयान के समान समस्या थी और एकमात्र चीज जो मेरे दिमाग में एक काम के रूप में आई थी, वैरिएबल सेट करने और इसे बैच से कॉल करने के लिए त्रुटि में बैच लिखना था।

    ConsoleApplication1.exe:

    'put some sensible code here 
    'put result in variable myResult 
    Dim myResult As String = Guid.NewGuid().ToString("D").ToUpperInvariant() 
    Console.WriteLine("Normal output from the consonle app") 
    Console.Error.WriteLine("@ECHO OFF") 
    Console.Error.WriteLine("SET zzzResult={0}", myResult) 
    

    Test.cmd (बुला बैच):

    @ECHO OFF 
    :Jump to folder of batch file 
    PUSHD %~d0%~p0 
    
    :Define a temp file 
    SET zzzTempFile=%TEMP%\TMP%Random%.CMD 
    
    :Call .NET console app 
    ConsoleApplication1.exe 2>%zzzTempFile% 
    
    :Call the generated batch file 
    CALL %zzzTempFile% 
    
    :Clean up temp file 
    DEL %zzzTempFile% 
    
    :Clean up variable 
    SET zzzTempFile= 
    
    :Do something with the result 
    ECHO Yeah, we finally got it! 
    ECHO: 
    ECHO The value is "%zzzResult%". 
    ECHO: 
    
    :Clean up result variable 
    SET zzzResult= 
    
    :Go back to original folder 
    POPD 
    

    कि चाल करना चाहिए। और हाँ, मुझे पता है कि यह एक पुरानी पोस्ट है और रयान अब तक अन्य मुद्दों को हल कर रहा है, लेकिन वहां एक और समस्या होने के बावजूद कोई और भी हो सकता है ...

    0

    इस पर हाल ही में खुद को ठोकरने के बाद, मैं इस दृष्टिकोण के साथ आया था। क्या मैं, प्रक्रिया वर्ग का उपयोग कर पहले बल्लेबाजी फ़ाइल चलाया जाता है किया अर्थात

    // Spawn your process as you normally would... but also have it dump the environment varaibles 
    Process process = new Process(); 
    process.StartInfo.FileName = mybatfile.bat; 
    process.StartInfo.Arguments = @"&&set>>envirodump.txt"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = false; 
    process.Start(); 
    string output = process.StandardOutput.ReadToEnd(); 
    process.WaitForExit(); 
    
    // Read the environment variable lines into a string array 
    string[] envirolines = File.ReadAllLines("envirodump.txt"); 
    File.Delete("envirodump.txt"); 
    
    // Now simply set the environment variables in the parent process 
    foreach(string line in a) 
    { 
        string var = line.Split('=')[0]; 
        string val = line.Split('=')[1]; 
        Environment.SetEnvironmentVariable(var, val); 
    } 
    

    यह मेरे लिए काम किया है लगता है। यह सबसे साफ दृष्टिकोण नहीं है, लेकिन एक बाध्य में काम करेगा। :)

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