C # Invoke Powershell с предварительно созданным объектом - PullRequest
2 голосов
/ 05 ноября 2011

Я только начал с PS и пишу некоторые классы C #, которые мне нужно протестировать изнутри PS.

Обратите внимание, что эти классы НЕ являются CmdLets.

Я хочу сделать что-то вроде этого:

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); 

Где я вызываю Run ()на объекте, переданном PS, результатом будет распечатка «Hello world».

Но я даже не уверен, что это возможно (возможно, по соображениям безопасности).

Iфигура У меня есть 2 варианта:

  1. Либо это возможно.Если да, пожалуйста, помогите мне :)?

  2. Мне нужно будет сгенерировать файл сценария на основе моего существующего объекта и выполнить команду «AddScript (...)»"чтобы ps выполнил его.

Любые указатели, которые помогут мне начать, были бы хороши:).

С уважением.

1 Ответ

3 голосов
/ 05 ноября 2011

Я нашел решение:

        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.
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...