سؤال

أود أن تمر النقابي من C# الى Powershell.وكمثال على ذلك أود أن تنفيذ هذا powershell سطر من التعليمات البرمجية:


PS C:\> get-command | select name, @{N="Foo";E={"Bar"}} -first 3

Name                                                        Foo
----                                                        ---
Add-Content                                                 Bar
Add-History                                                 Bar
Add-Member                                                  Bar

أود أن تفعل هذا عن طريق خط أنابيب من متميزة الأوامر في مقابل أمر واحد علامة البرنامج النصي.هنا كود:


Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();

pipeline.Commands.Add("get-command");

Command c = new Command("select-object");
List properties = new List();
properties.Add("name");
properties.Add("@{N=\"Foo\";E={\"Bar\"}}");
c.Parameters.Add("Property", properties.ToArray());
c.Parameters.Add("First", 3);
pipeline.Commands.Add(c);

pipeline.Commands.Add("Out-String");

Collection retval = pipeline.Invoke();
runspace.Close();

StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in retval)
    Console.WriteLine(obj.ToString());

ولكن هذا النقابي يتم تمريرها في كمعلمة إلى اختيار وجوه لا يتم تحليل بشكل صحيح.هذا هو ما يخرج من الجانب الآخر:


PS C:\test> c:\test\Bin\Debug\test.exe

Name                                     @{N="Foo";E={"Bar"}}
----                                     --------------------
Add-Content
Add-History
Add-Member

ما هو الخطأ في كيفية انا إعداد حدد الكائن الأوامر المعلمات ؟

هل كانت مفيدة؟

المحلول

إنشاء خط أنابيب من خلال c# و إنشاء خط أنابيب مع الأم النصي powershell رئيسية واحدة الفرق هو في الواقع تماما خفية:المعلمة الموثق.

إذا قمت بكتابة نسخة من التعليمات البرمجية الخاصة بك في نقي السيناريو سوف تحصل على نفس الخطأ:hashtable الحرفي هو تعامل قيمة سلسلة.

ps> $ps = $ps.Commands.Add("get-process")
ps> $ps = $ps.Commands.Add("select-object")
ps> $ps.Commands[1].Parameters.Add("Property", @("Name", '@{N="Foo";E={"Bar"}}'))

في هذه الحالة الأمر يتلقى مجموعة من سلسلتين ، "اسم" و hashtable سلسلة حرفية.هذا وسيتم تقسيم في بالضبط بنفس الطريقة C#.الآن نلقي نظرة على الطريقة الصحيحة للقيام بذلك (في السيناريو) - اسمحوا لي أن إعادة كتابة سطر 3:

ps> $ps.Commands[1].Parameters.Add("Property", @("Name", @{N="Foo";E={"Bar"}}))

ما الذي تغير إذن ؟ إزالة علامات الاقتباس حول hashtable -- أنا تمرير hashtable كما 2nd عنصر صفيف كائن!لذا للحصول على C# مثلا إلى العمل ، عليك أن تفعل ما المعلمة الموثق لا بالنسبة لنا في سطر الأوامر (وهو كثير جدا!).محل:

properties.Add("@{N=\"Foo\";E={\"Bar\"}}");

مع

properties.Add(
    new Hashtable {
        {"N", "Foo"},
        {"E", System.Mananagement.Automation.ScriptBlock.Create("\"Foo\"")}
    }
);

آمل أن يوضح هذا الامر بالنسبة لك.المعلمة الموثق هو على الارجح أقل وضوحا ولكن أقوى جزء من powershell الخبرة.

-Oisin

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top