Создание конвейера через c # и создание конвейера со встроенным скриптом PowerShell имеют одно существенное отличие, которое на самом деле довольно неуловимо: связыватель параметров.
если я напишу версию вашего кода в чистом виде, я получу ту же ошибку: литерал хеш-таблицы обрабатывается как строковое значение.
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"}}'))
В этом случае команда получает массив из двух строк: «имя» и буквенную строку хеш-таблицы. Это будет сломано точно так же, как ваш C #. Теперь взглянем на правильный способ сделать это (в сценарии) - позвольте мне переписать строку 3:
ps> $ps.Commands[1].Parameters.Add("Property", @("Name", @{N="Foo";E={"Bar"}}))
Так что изменилось? Я удалил кавычки вокруг хеш-таблицы - я передаю хеш-таблицу как второй элемент массива объектов! Итак, чтобы ваш пример C # работал, вам нужно сделать то, что связыватель параметров делает для нас в командной строке (что довольно много!). Заменить:
properties.Add("@{N=\"Foo\";E={\"Bar\"}}");
с
properties.Add(
new Hashtable {
{"N", "Foo"},
{"E", System.Mananagement.Automation.ScriptBlock.Create("\"Foo\"")}
}
);
Надеюсь, это прояснит для вас. Связыватель параметров, вероятно, является наименее заметной, но самой мощной частью взаимодействия с PowerShell.
-Oisin