如何给用户输入自定义powershell cmdlet从另一个项目

本文关键字:cmdlet 另一个 项目 powershell 自定义 给用户 输入 | 更新日期: 2023-09-27 18:11:48

我有一个单独的测试项目来测试我的cmdlets项目,该项目有如下调用:

pSCmdletObject.InvokeCommand.InvokeScript("Write-Host " + outputString); and
pSCmdletObject.InvokeCommand.InvokeScript("Read-Host");

我已经使用了PSHostUserInterface, PSRawUserInterface, PSHost实现示例C:'Program Files (x86)'Microsoft sdk 'Windows'v7.0'Samples'sysmgmt'WindowsPowerShell'csharp'Host03

问题是:

TestClass.cs (Test项目):

using (Runspace runSpace = RunspaceFactory.CreateRunspace(new Host(new TestClass())))
{
    runSpace.Open();
    using (Pipeline pipeline = runSpace.CreatePipeline())
    {
        pipeline.Commands.Add("CustomCommand-Get");
        var output = pipeline.Invoke();   //<<< (1)
    }
}

在"(1)"处,当调用"Invoke"时,调用实际项目中编写的"CustomCommand"实现。在实际cmdlets项目的"CustomCommand"的"ProcessRecord()"中,当调用"Read-Host"时,该项目只是等待我目前无法提供的输入,因为我无法找到一种方法。我的测试项目有Invoke调用,我想避免使用控制台。我想根据测试用例对输入进行硬编码,因为实际的Custom Cmdlet项目是一个完全不同的项目,可以独立运行。这能做到吗?如果有,怎么做?还有别的办法吗?

Thanks in advance

如何给用户输入自定义powershell cmdlet从另一个项目

如果你有一个自定义的主机实现,那么你可以修改主机impl来创建一个测试主机impl,在那里你可以让PSHostUserInterface.Prompt()PSHostUserInterface.ReadLine()在调用这些方法时返回你想要的任何东西。这些方法(加上PSHostUserInterface.ReadLineAsSecureString())被Read-Host调用来从主机(最终用户)读取字符串。