在c#自定义Cmdlet执行期间收集用户输入(不是通过参数)

本文关键字:参数 输入 用户 Cmdlet 自定义 执行期 | 更新日期: 2023-09-27 18:06:05

我正在编写与Google Apps API接口并需要Oauth2身份验证的cmdlet。如果用户试图在没有经过身份验证的情况下运行Cmdlet,而且这不仅仅是刷新令牌,那么我需要他们输入浏览器提供的访问码。(这些都已经解决了。)我想在必要时暂停cmlet,等待他们的输入,然后只有在验证后才继续。

然而,我现在只能通过抛出一个错误来退出当前的Cmdlet,然后指示用户将访问码作为参数传递给另一个Cmdlet(笨拙)来做到这一点。

我一直在寻找一种方法来调用c#的控制台之类的东西。Readline(这只是在执行cmdlet时被跳过)或试图调用Read-Host cmdlet;一旦我从用户那里获得访问代码,代码就可以继续正常执行。我知道这不一定是"Powershell方式",但为了这些工具,我觉得这是用户的最佳选择。

如果我尝试这个方法:

ReadHostCommand read = new ReadHostCommand();
read.prompt = "Access Code";
foreach (string s in read.Invoke<string>()) {
    WriteObject(s);
}

我得到一个错误:从PSCmdlet派生的cmdlet不能被调用直接。

搜索错误导致我尝试创建一个新的Host对象,如下所示,我得到另一个错误(也如下):

PowerShell ps = PowerShell.Create();
ps.AddCommand("Read-Host");
foreach (PSObject result in ps.Invoke()) {
    WriteObject(result);
}

Read-Host:一个命令提示用户失败,因为主机程序或命令类型不支持用户交互。尝试一个主机程序支持用户交互,如Windows PowerShell控制台或WindowsPowerShell ISE,并从命令类型中删除与提示符相关的命令不支持用户交互,如Windows PowerShell工作流

是否有办法暂停cmdlet从用户获得一个字符串?

编辑:为了澄清,我正在编写从Powershell控制台或ISE或类似的cmdlet中运行的cmdlet,并且需要在cmdlet执行过程中从用户获得输入。

在c#自定义Cmdlet执行期间收集用户输入(不是通过参数)

如果您的cmdlet派生自PSCmdlet,则使用this.InvokeCommand.InvokeScript()来调用Read-Host cmdlet。或者您可以使用this.Host.UI.Prompt*/Read*()方法

听起来您实际上需要实现PSHost(以及PSHostUserInterface和PSHostRawUserInterface类)。在此过程中,您将实现通过read-host和write-host与用户交互的功能(可能使用console.readline)。