0

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

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

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

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

Get-Name :术语“Get-Info”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。

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

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

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

以下是 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

想法是 get-info 获取与某个对象有关的所有内容,但您可以使用 get-name 来获取特定信息。

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

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

谢谢!

4

2 回答 2

1

我相信我已经找到了答案

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

您可以在 Powershell.Create(); 之后添加以下内容 包括您当前的程序集。

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

再次感谢您的协助。

于 2014-10-14T00:55:28.263 回答
0

你是对的,它没有被导入。虽然您可以使用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
于 2022-01-06T02:42:16.070 回答