Как включить ScriptBlocks в размещенную среду PowerShell

1

Недавно я начал изучать скрипты powershell, а также хостинг для PowerShell.

Из командной строки powershell следующая строка выполняется, как я ожидал.

"fee" | &{ process { $_; $args } } "fi" "fo" "fum"

Этот скрипт выводит "гонорар", который в конвейере ($ _) плюс "fi", "fo" и "fum", которые передаются в качестве аргументов scriptBlock ($ args).

Я пытаюсь достичь такого же результата, используя класс System.Management.Automation.Powershell.

Когда я пробую это:

        using (var ps = PowerShell.Create())
        {
            var result = ps
                .AddScript(@"&{ process { $_; $args} }")
                    .AddArgument("fi")
                    .AddArgument("fo")
                    .AddArgument("fum")
                .Invoke(Enumerable.Repeat("fee", 1));
        }

мой массив результатов содержит единственный пустой элемент (не уверен, что там происходит).

Если я попробую:

        using (var ps = PowerShell.Create())
        {
            var result = ps
                .AddCommand("Invoke-Command")
                    .AddParameter("ScriptBlock", ScriptBlock.Create(@"&{ process { $_; $args } }"))
                    .AddParameter("ArgumentList", new string[] { "fi", "fo", "fum"})
                .Invoke(Enumerable.Repeat("fee", 1));
        }

выводится только "гонорар". Массив $ args пуст.

Наконец, когда я пробую это:

        using (var ps = PowerShell.Create())
        {
            var result = ps
                .AddCommand("Invoke-Command")
                    .AddParameter("ScriptBlock", ScriptBlock.Create(@"&{ process { $_; $args } } ""fi"" ""fo"" ""fum"""))
                .Invoke(Enumerable.Repeat("fee", 1));
        }

Я становлюсь ближе. Консолидированная "плата" и аргументы "fi", "fo" и "fum" выводятся. Проблема с этим, однако, заключается в том, что я идеально предпочел бы динамически передавать мои аргументы в scriptBlock, а не конкатенировать их в выражение блока сценария.

Мой вопрос заключается в том, как я могу создать блок сценария в размещенной среде powershell, которая может как получать доступ к данным в конвейере, из которого он вызывается, так и принимать параметры? Я только смог достичь того или другого. Я использую версию 4.5.Net framework и версию 3 сборки System.Management.Automation.

Теги:
powershell
hosting

1 ответ

1
Лучший ответ

Это потому, что неправильный скрипт используется для AddScript, &{} не должен использоваться, потому что он фактически выполняется Invoke() в коде С#. Вот аналог PowerShell кода С#, который работает:

$ps = [powershell]::Create()
$ps.AddScript('process { $_; $args}').
AddArgument('fi').
AddArgument('fo').
AddArgument('fum').
Invoke(@('fee'))

Вывод:

fee
fi
fo
fum

как и ожидалось.

  • 0
    Этот ответ помогает?
  • 0
    Чувак, ты рок! Одна из многих перестановок, которые я пытался привести к этому посту, была именно тем, что вы имели, за исключением того, что мой сценарий был «{process {$ _; $ args;}}». Когда я выполнил это, я бы просто получил один результат обратно, содержащий объект scriptBlock. Тьфу, это имеет смысл сейчас, но не было смысла пробовать это вчера. Я создавал scriptBlock (с AddScript), который создавал другой scriptBlock в качестве вывода. Большое спасибо за разъяснение этого римского.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню