代码之家  ›  专栏  ›  技术社区  ›  VA systems engineer

当对象是管道中的第一件事时,如何将C#对象加载到运行空间管道中以供PowerShell执行?[副本]

  •  0
  • VA systems engineer  · 技术社区  · 7 年前

    我刚从PS开始,正在编写一些C类,需要在PS中进行测试。

    我想做这样的事情:

    var myCustomObj = new CustomObj { Message = "Hello world" };
    
    var ps = Powershell.Create();
    
    ps.AddCommand("Import-Module").AddParameter("Assembly", "MyCustomAsm");
    ps.AddCommand("myCustomObj.Run()").AddParameter(myCustomObj);
    
    foreach(string str in ps.AddCommand("Out-String").Invoke<string>()) 
            Console.WriteLine(str); 
    

    当我在交给PS的对象上调用Run()时,结果将是打印输出“Hello world”。

    但我甚至不确定这是否可行(可能是出于安全原因)。

    我想我有两个选择:

    1. 要么这是可能的。如果是这样,请帮助我:)?

    任何让我开始的建议都很好:)。

    致以诚挚的问候。

    0 回复  |  直到 14 年前
        1
  •  3
  •   Christian Mikkelsen    14 年前

    我找到了一个解决方案:

            var objs= new PSDataCollection<CustomObj> {obj};
    
            using (var ps = PowerShell.Create())
            {
                ps.Runspace.SessionStateProxy.SetVariable("objList", objs);
                ps.AddScript(@"$objList| ForEach { $_.Run()}");
                ps.AddCommand("Out-String");
                var output = ps.Invoke();
    
                var stringBuilder = new StringBuilder();
                foreach (var obj in output)
                {
                    stringBuilder.AppendLine(obj.ToString());
                }
    
                var result = stringBuilder.ToString().Trim();
    
                //Evaluate result.
            }