Недавно я начал изучать скрипты 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.
Это потому, что неправильный скрипт используется для AddScript
, &{}
не должен использоваться, потому что он фактически выполняется Invoke()
в коде С#. Вот аналог PowerShell кода С#, который работает:
$ps = [powershell]::Create()
$ps.AddScript('process { $_; $args}').
AddArgument('fi').
AddArgument('fo').
AddArgument('fum').
Invoke(@('fee'))
Вывод:
fee
fi
fo
fum
как и ожидалось.