正在尝试从C#中调用PSCmdlet类

本文关键字:调用 PSCmdlet | 更新日期: 2023-09-27 18:26:27

起初,我试图简单地声明cmdlet的新实例,但遇到一个错误,表明我无法从cmdlet中调用pscmdlet类型的powershell cmdlet。

为了做到这一点,我必须实例化Powershell引擎。

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

在我的情况下,如果我使用Get-Process,效果很好,但同一项目中的另一个PSCmdlet Get-Info似乎不起作用。

Get-Name:术语"Get-Info"未被识别为cmdlet的名称,函数、脚本文件或可操作程序。检查的拼写名称,或者如果包含路径,请验证该路径是否正确,并且再试一次。

我可以从powershell窗口手动调用get-info,但不能从代码中调用。

这可能与模块路径有关吗?还是因为我的模块没有加载到这个新实例化的引擎中?

如果是,我该如何让新引擎也加载模块?

以下是获取信息的定义

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

调用powershell.create()的cmdlet是get-name

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

其理念是获取信息可以获取与某个对象相关的所有信息,但您可以使用获取名称来获取特定信息。

我希望用它来创建更小、更受约束的cmdlet,只需调用get-info。

但我认为这与路径有关,因为我的项目没有导入到getname中实例化的新创建的powershell引擎中。

谢谢!

正在尝试从C#中调用PSCmdlet类

我相信我已经在找到了答案

托管PowerShell在同一程序集中看不到Cmdlet

您可以在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)));

虽然从C#调用PowerShell是有好处的,但如果你很想这么做,你应该重新考虑你的方法,因为你可能遵循反模式。在您的情况下,Get-Name听起来像是在试图返回Get-Info的部分信息;在这种情况下,最好只使用一个cmdlet,并像一样使用Select-Object

Get-Info | Select-Object -Property Property1,Property2,Property3,etc