Попытка вызвать класс 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