2016-12-23 9 views
5

में डेटाटेबल के रूप में रिटर्न पावरहेल पीएसओब्जेक्ट मैंने एक पावरहेल स्क्रिप्ट लिखी है जो एक CSV फ़ाइल पढ़ता है और डेटा से पूर्व निर्धारित संग्रह देता है। नीचे कहा गया स्क्रिप्ट का एक नमूना आउटपुट है।सी #

Count  Name 
------ ------ 
    12  Rubies 
    3  Pearls 
    20  Emeralds 

मैं बहुत की तरह एक PSObject में संग्रहीत करके सी # में परिणाम प्राप्त करने में सक्षम हूँ:

var shell = PowerShell.Create(); 
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1"); 
Collection<PSObject> results = shell.Invoke(); 

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

foreach (PSObject psObject in results) 
{ 
    localVariable = Convert.ToString(psObject.Properties["Name"].Value); 
} 

हालांकि, मुझे इस समाधान को गतिशील में परिवर्तित करने में समस्या हो रही है। यही कहना है कि पंक्तियों की संख्या अलग-अलग होने की उम्मीद है। तो मैंने इसे पहले लागू किया है जब स्रोत here पर पोस्ट किए गए समाधान के समान समाधान का उपयोग कर SQL डेटाबेस है, इसलिए मैंने माना है कि डेटाटेबल्स जाने का तरीका होना चाहिए लेकिन मैं इसे इस परिदृश्य में काम नहीं कर सकता। कोई विचार या सुझाव? धन्यवाद!

नोट: यहां पावरहेल स्क्रिप्ट घटक अनिवार्य है क्योंकि इसमें आउटपुट बनाने के लिए अन्य तंत्र शामिल हैं, जबकि मैं सी # सी का उपयोग कर सीएसवी फ़ाइल से पढ़ सकता हूं, यह बस एक विकल्प नहीं है।

+0

आपको क्या समस्या है? जो मैंने समझा, उससे आप सभी परिणामों को फिर से शुरू कर रहे हैं और बिना किसी समस्या के अपने गुणों का उपयोग कर रहे हैं, तो लाइनों की परिवर्तनीय संख्या के कारण होने वाली सटीक समस्या क्या है? –

+0

हाय लुकास, मैं केवल मूल्य लाने में सक्षम हूं अगर मुझे पता है कि कितनी पंक्तियां हैं। (सरणी संदर्भ 'सरणी [0]' या 'सरणी [1]) के समान है। मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जो सभी परिणामों को एक डेटाटेबल में संग्रहीत कर सके।आशा है आप यह बात समझ गए होंगे। – Yad

+0

जब आप किसी फ़ोरैच स्टेटमेंट के साथ पुनरावृत्त कर रहे हैं तो आपको सर रेफरेंसिंग की आवश्यकता नहीं है। और यदि आप करते हैं, तो भी मैं

उत्तर

1

मुझे आपके प्रश्न से क्या समझा गया है कि आप डेटा डेटा को और डेटा प्रक्रिया के लिए रखना चाहते हैं और आप इसे अपने संबंधित संग्रह में उपयोग करना चाहते हैं।

आप इस तरह आगे बढ़ सकते हैं:

DataTable dt=new DataTable(); 
dt.Colums.Add("Count"); 
dt.Colums.Add("Name"); 
foreach (PSObject psObject in results) 
{ 
    foreach(PSPropertyInfo prop in psObject.Properties) 
    { 
    var count=prop.Name; 
    var name=prop.Value; 
    //In other words generate output as you desire. 
    dt.Rows.Add(count,name); 
    } 
} 

आशा है कि यह आपके लिए उपयोगी है।

प्रलेखन मौजूद हैं: Doc 1 और Doc 2

1

आप पहले से ही csv फ़ाइल को पढ़ने के लिए powershell का उपयोग कर रहे के बाद से, क्यों जारी नहीं?

आप सी # में इसे प्रबंधित करने से पहले अपने * .ps1 फ़ाइल के परिणामों को फिर से चलाने के लिए पावरहेल कमांड/स्क्रिप्ट का आह्वान कर सकते हैं।

सी # में एक स्क्रिप्ट का आह्वान करना काफी आसान है, और आपको फ़ाइल के रूप में स्क्रिप्ट बनाने की आवश्यकता नहीं है। आप सीधे स्क्रिप्ट टेक्स्ट भेज सकते हैं और इसे आमंत्रित कर सकते हैं।

var shell = PowerShell.Create(); 
shell.Commands.AddScript("C:\\Scripts\\Powershell\\Get-MyData.ps1 | foreach {do-something $_}"); 
Collection<PSObject> results = shell.Invoke(); 

सूचना है कि मैं अपनी स्क्रिप्ट परिणाम लौटा दिया जाता है के बाद एक पाइप कहा:

हो सकता है आप भी करने के लिए 2 समान जोड़ सकते हैं। याद रखें कि 'AddScript' powerhell.exe पर टेक्स्ट का एक गुच्छा भेजने जैसा है। मैंने पूरी स्क्रिप्ट फ़ाइलों को एम्बेडेड संसाधनों से पहले इस विधि में धक्का दिया है।

1

उपयोग Linq:

IEnumerable<dynamic> dynamicResults = from item in results          
             select new { Name = item.Name, Count = item.Count }; 

फिर myDataGrid.ItemsSource = dynamicResults सेट;