मैं एक सी #/डब्ल्यूपीएफ ऐप बना रहा हूं जिसे पावरशेल के साथ बातचीत करने की जरूरत है (मूल रूप से, कमांड और स्क्रिप्ट चलाएं)। प्रक्रिया बनाना और इसे लॉन्च करना कोई समस्या नहीं है, यह बहुत आसान है, लेकिन यह तब और कठिन हो जाता है जब लक्ष्य इसे बिना किसी स्क्रिप्ट के लॉन्च करना होता है और बाद में इसे कमांड और स्क्रिप्ट चलाना होता है:

  1. C# ऐप लॉन्च करें
  2. समानांतर में पावरशेल प्रक्रिया चलाएँ
  3. [...] कुछ अन्य सामान करो [...]
  4. प्रक्रिया पर कमांड चलाएँ

मैंने कई समाधानों की कोशिश की। System.Diagnostics.Process वर्ग के साथ, मैं इस प्रक्रिया को लॉन्च करने में सक्षम हूं, इसे चलने देता हूं, लेकिन अगर मैं स्ट्रीम को पुनर्निर्देशित करता हूं, तो भी stdin को लिखना काम नहीं करता है:

var startInfo = new ProcessStartInfo()
{
    FileName = "powershell.exe",
    Arguments = "-ExecutionPolicy Bypass -NoLogo -NoExit",
    CreateNoWindow = true,
    RedirectStandardError = true,
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
    WindowStyle = ProcessWindowStyle.Hidden
};
_ps = new Process()
{
    EnableRaisingEvents = true,
    StartInfo = startInfo
};
_ps.Start();

[...]

_ps.StandardInput.WriteLine(TextBox_Input.Text); // No effect

System.Management.Automation.PowerShell वर्ग का उपयोग करना बेहतर नहीं है, मैं पाइपलाइन तैयार कर सकता हूं (निष्पादित होने वाली स्क्रिप्ट जोड़ें), इसे लागू करें, लेकिन, मैं बाद में प्रक्रिया को जीवित रखते हुए स्क्रिप्ट नहीं चला सकता।

मुझे जितनी जल्दी हो सके प्रक्रिया को लॉन्च करने की आवश्यकता है ताकि मैं इसे आदेश भेज सकूं और उन्हें तेज़ी से चला सकूं (और प्रक्रिया शुरू करने से बचें जो विलंबता का कारण बन जाएगा)।

1
Gaël 5 मार्च 2016, 16:28
पावरशेल संस्करण को लक्षित करें?
 – 
user4003407
5 मार्च 2016, 17:38
आखिरी वाला: विंडोज 10 पर पावरशेल 5.0
 – 
Gaël
5 मार्च 2016, 18:07
एप्लिकेशन लॉन्च होने पर एक Runspace बनाएं, फिर उस रनस्पेस में टेक्स्ट बॉक्स इनपुट से आपके द्वारा बनाए गए सभी बाद के System.Management.Automation.PowerShell इंस्टेंस असाइन करें।
 – 
Mathias R. Jessen
5 मार्च 2016, 18:54
@MathiasR.Jessen आपके उत्तर के लिए धन्यवाद, पृष्ठभूमि में रनस्पेस लॉन्च पावरशेल बना रहा है? मैंने सोचा था कि यह केवल BeginInvoke() को कॉल करने के बाद किया गया था, लेकिन अगर मैं गलत हूं (इसलिए, यदि रनस्पेस बनाने से पावरशेल लॉन्च होता है और BeginInvoke() बनाई गई प्रक्रिया पर स्क्रिप्ट चलाता है), तो यह सही होगा। क्या आप मुझे इसके बारे में थोड़ा और बता सकते हैं?
 – 
Gaël
5 मार्च 2016, 19:15
इन-प्रोसेस Runspace पावरशेल प्रोसेस नहीं बनाता है। यह आपकी प्रक्रिया के अंदर पावरशेल कोड चलाता है।
 – 
user4003407
5 मार्च 2016, 19:19

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि टिप्पणियों में बताया गया है, एप्लिकेशन लॉन्च होने पर एक रनस्पेस सेट अप करें (और खोलें):

Runspace rs;
public MainWindow()
{
    InitializeComponent();
    rs = RunspaceFactory.CreateRunspace();
    rs.Open();
}

अब, आपको केवल एक फ़ंक्शन की आवश्यकता है जो एक PowerShell उदाहरण बनाता है और इसे रनस्पेस में निष्पादित करता है:

private Collection<PSObject> RunScript(string script)
{
    using(PowerShell ps = PowerShell.Create())
    {
        ps.AddScript(script);
        ps.Runspace = rs;
        return ps.Invoke();
    }
}

और फिर, उपयोगकर्ता द्वारा स्क्रिप्ट इनपुट चलाने के लिए आपके ईवेंट हैंडलर में:

private void button_Click(object sender, RoutedEventArgs e)
{
    Collection<PSObject> returnedObjects = RunScript(TextBox_Input.Text);
    // do what you want with returnedObjects if necessary
}

यह, निश्चित रूप से, एक अत्यधिक सरलीकृत उदाहरण है। वास्तविक दुनिया के एप्लिकेशन में आप त्रुटि और चेतावनी धाराएं, एपीएम (BeginInvoke()/EndInvoke()) आदि का प्रयोग करें।

4
Mathias R. Jessen 5 मार्च 2016, 20:10
1
और अगर कोई वास्तव में अलग पावरशेल प्रक्रिया चाहता है, तो उसे CreateRunspace() को CreateOutOfProcessRunspace(null) में बदलना होगा।
 – 
user4003407
5 मार्च 2016, 20:18
सही है, लेकिन टिप्पणियों से ऐसा लगता है कि "अलग प्रक्रिया" की बात कुछ थी। XY अनुरोध
 – 
Mathias R. Jessen
5 मार्च 2016, 20:22
@MathiasR.Jessen मैंने Runspace और PowerShell का उपयोग करने की कोशिश नहीं की है, और... यह एक आकर्षण की तरह काम करता है! इतनी जल्दी प्रतिक्रिया देने के लिए धन्यवाद। और आप सही कह रहे हैं, यह एक XY अनुरोध था, मेरी व्याख्या बहुत बढ़िया नहीं थी, लेकिन, आपको इसका समाधान मिल गया!
 – 
Gaël
5 मार्च 2016, 20:54