2015-12-17 5 views
5

काफी नया सी #, PowerShell के लिए इतना नया नहीं है।सी # कंसोल आउटपुट के माध्यम से पावरशेल अलग

मैं पावरशेल कोड निष्पादित करने के लिए सी # का उपयोग करना चाहता हूं। हालांकि ऑब्जेक्ट्स का आउटपुट PowerShell विंडो में चल रहे कमांड के समान नहीं है। मैं अपने डेटा के बजाए ऑब्जेक्ट का नाम वापस लेता हूं।

string script = @" 
    get-process | ft 
"; 

PowerShell powerShell = PowerShell.Create(); 

powerShell.AddScript(script); 
var results = powerShell.Invoke(); 
foreach (var item in results) 
{ 
    Console.WriteLine(item); 
} 

रिटर्न:

Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

हालांकि एक PowerShell आदेश पंक्ति खिड़की यह एक अधिक रिटर्न में यहाँ मैं क्या कोशिश कर रहा हूँ है फॉर्मेटेड टेबल व्यू:

पीएस सी: \ ड्रॉपबॉक्स \ पावरशेल> ps | फीट

हैंडल एनपीएम (के) पीएम (के) डब्ल्यूएस (के) वीएम (एम) सीपीयू आईडी एसआई प्रक्रिया नाम ------- ------ ----- - ---- ----- ------ - - ----------- 131 12 1980 2572 85 0,45 13216 1 acrotray

सच दो चाहते हैं बातें:

  1. कोड कि PowerShell आदेश खिड़की
  2. क्या चल रहा है की एक विवरण के रूप में ही उत्पादन का उत्पादन होगा तो मैं सीख सकते हैं ना करने के लिए इसे बेहतर ढंग से

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

+1

http://stackoverflow.com/questions/24661972/output-a-powershell-object-into-a-string – RobSiklos

उत्तर

3

मैंने इसे समझ लिया, कोडप्रोजेक्ट पर एक कोड उदाहरण के लिए धन्यवाद, मुझे पता चला कि "आउट स्ट्रिंग" कमांड को सभी आदेशों के अंत में जोड़ा जाना चाहिए। तो जोड़ने के लिए अतिरिक्त कोड है:

ps.AddCommand ("आउट-स्ट्रिंग");

मुझे आश्चर्य है कि कंसोल बस ऐसा कर रहा है या यदि इसके लिए और कुछ है।

+0

का संभावित डुप्लिकेट मुझे लगता है कि होस्ट ऐसा कर रहा है (चाहे वह कंसोल होस्ट हो या ISE मेजबान, यह उसके कार्य का हिस्सा है)। जब आप एक रनस्पेस का उपयोग करते हैं तो यह सी # में होता है जो डिफ़ॉल्ट रूप से नहीं होता है, तो अब आप जो कर रहे हैं वह ठीक है, या आप अपना आवेदन एक पूर्ण मेजबान हो सकते हैं और इसे वहां लागू कर सकते हैं। – briantist

+0

पावरशेल इंजन किसी भी अनधिकृत ऑब्जेक्ट को 'आउट-डिफॉल्ट' कमांड पर पूर्ण रूप से पाइप करता है, और 'आउट-डिफॉल्ट' उन्हें होस्ट पर टेक्स्ट में बदल देता है। – PetSerAl

0

पावरशेल कंसोल और आईएसई में टेबल स्टाइल आउटपुट लौटने के लिए अपने स्वयं के एक्सएमएल स्वरूपण दस्तावेज़ का उपयोग करता है। आउट-स्ट्रिंग वह जगह है जहां यह स्वरूपण आपके मामले में खेलता है क्योंकि यह स्वरूपण को संरक्षित रखेगा (आप प्रत्येक पंक्ति को निष्पादित करने के लिए स्ट्रिंग के साथ '-स्ट्रीम' स्विच का उपयोग कर सकते हैं)।

आउट-स्ट्रिंग का उपयोग किये बिना किसी ऑब्जेक्ट से जानकारी वापस निकालना संभव है; हालांकि, मेरे अनुभव में यदि आप केवल यह जानकारी प्रदर्शित कर रहे हैं; स्ट्रिंग को वापस करने का यह आपका सबसे अच्छा विकल्प है। हालांकि, अगर आपको ऑब्जेक्ट पर अतिरिक्त प्रोसेसिंग करने की आवश्यकता है तो आप ऑब्जेक्ट वापस कर सकते हैं और उसके बाद सशर्त प्रदर्शन कर सकते हैं कि आप किस प्रकार की ऑब्जेक्ट से काम कर रहे हैं। उदाहरण के लिए, यदि मुझे PowerShell ('आउट-स्ट्रिंग' का उपयोग न करने के बाद ऑब्जेक्ट्स में हेरफेर करने की आवश्यकता है) मैं निम्नलिखित का उपयोग करता हूं:

सिस्टम। डायग्नोस्टिक।की प्रक्रिया प्रक्रिया कमान से अपने लौटे ऑब्जेक्ट प्रकार है - के बाद से मैं अपने प्रश्न में यह दिखाई नहीं देता सुनिश्चित करें कि आप जानते हैं कि वास्तव में क्या प्रकार तुम वापस सी #

using (PowerShell psRunspace = PowerShell.Create()) 
     { 
      psRunspace.AddCommand("Get-Process"); 
      psRunspace.AddParameter("ComputerName", computerName); 

      Collection<PSObject> outputObj = psRunspace.Invoke(); 

      foreach (PSObject obj in outputObj) 
      { 
       var objProperties = obj.Properties; 
       var objMethods = obj.Methods; 
       var baseObj = obj.BaseObject; 

       if (baseObj is System.Diagnostic.Process) 
       { 
        var p = (System.Diagnostic.Process)baseObj; 
        //you can now access all members of this object normally 
        //Do something here with p.Properties or p.Methods etc... 
       } 
      } 

करने से गुजर रहे हैं मैं भी सिफारिश करेंगे आपत्ति है, , अपने powerhell कमांड को निष्पादित करने के लिए 'उपयोग' कथन का उपयोग करने पर विचार करें। यह आपके लिए पाइपलाइन/रनस्पेस को खोल और बंद कर देगा। आपके उदाहरण में ऐसा प्रतीत नहीं होता है कि आपने उस पाइपलाइन को तब तक बंद कर दिया जब तक कि आपने इसे अपने उदाहरण कोड से छोड़ा न हो। साथ ही, अपने इनवॉक कमांड में विशिष्ट रहें जो आप लौटने वाली वस्तुओं के लिए उपयुक्त प्रकार का उपयोग करते हैं और आप जिस ऑब्जेक्ट को लौट रहे हैं (PSObject) के प्रकार के ऊपर दिखाए गए संग्रह का उपयोग करते हैं।

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