Попытка вызвать класс PSCmdlet из C#

Сначала я попытался просто объявить новый экземпляр командлета, но получил ошибку, которая указала, что я не могу вызвать командлеты powershell типа pscmdlet из командлета.

чтобы сделать это, мне нужно создать движок Powershell.

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Info");

В моем случае, если я использую Get-Process, это прекрасно работает, но Get-Info, который является еще одним PSCmdlet в том же проекте, похоже, не работает.

Get-Name: термин "Get-Info" не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

Я могу вызвать get-info вручную из окна powershell, но не из своего кода.

Может быть, это связано с модульным путем? или потому что мой модуль не загружен в этот недавно созданный движок?

если да, то как мне получить новый движок для загрузки модуля?

Вот как определяется get-info

namespace APICLI
{
[Cmdlet(VerbsCommon.Get, "Info")]
public class GetInfo : PSCmdlet

командлет, который вызывает powershell.create(), называется get-name

namespace APICLI
{
[Cmdlet(VerbsCommon.Get, "Name")]
public class GetName : PSCmdlet

Идея состоит в том, что get-info получает все, что относится к определенному объекту, но вы можете использовать get-name для получения конкретной информации.

Я надеялся использовать это для создания меньших более ограниченных командлетов, которые просто вызывали бы get-info.

но я думаю, что это связано с путем, так как мой проект не импортирован во вновь созданный механизм powershell, созданный в get-name.

Спасибо!

2 ответа

Я думаю, что нашел ответ на

Размещенный PowerShell не может видеть командлеты в той же сборке

Вы можете добавить следующее после Powershell.Create(); включить вашу текущую сборку.

        PowerShell ps = PowerShell.Create();
        ps.AddCommand("Import-Module").AddParameter("Assembly", System.Reflection.Assembly.GetExecutingAssembly());
        ps.Invoke();
        ps.Commands.Clear();

Еще раз спасибо за помощь.

Вы правы в том, что он не импортируется. Хотя вы могли бы использовать Import-Module, гораздо более строго типизированный подход был бы

      PowerShell ps = PowerShell.Create();
ps.AddCommand(new CmdletInfo("Get-Info", typeof(GetInfo)));

Хотя у вызова PowerShell из C# есть свои преимущества, если у вас возникнет соблазн сделать это, вероятно, вам следует переосмыслить свой подход, поскольку вы, вероятно, следуете анти-шаблону. В твоем случае, Get-Nameпохоже, что он пытается вернуть часть информации Get-Infoявляется; в этом случае вам лучше иметь только один командлет и использовать Select-Objectвот так

      Get-Info | Select-Object -Property Property1,Property2,Property3,etc
Другие вопросы по тегам