تمرير النقابي من c# الى Powershell
-
03-07-2019 - |
سؤال
أود أن تمر النقابي من 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