2

我正在编写与 Google Apps API 交互并需要 Oauth2 身份验证的 Cmdlet。如果用户尝试在未经身份验证的情况下运行 Cmdlet 并且不仅仅是刷新令牌,我需要他们输入浏览器提供的访问代码。(这一切都已解决。)我想在必要时暂停 cmdlet,等待他们的输入,然后仅在验证后继续。

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

我一直在寻找一种方法来调用诸如 C# 的 Console.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 控制台或 Windows PowerShell ISE,并从不支持用户交互的命令类型(例如 Windows PowerShell 工作流)中删除与提示相关的命令。

有没有办法暂停 cmdlet 以从用户那里获取字符串?

编辑:为了澄清,我正在编写要从 Powershell 控制台或 ISE 或类似设备中运行的 Cmdlet,并且需要从用户 mid-cmdlet-execution 获取输入。

4

2 回答 2

5

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

于 2013-04-04T15:58:09.597 回答
0

听起来您实际上需要实现 PSHost(以及 PSHostUserInterface 和 PSHostRawUserInterface 类)。在这样做时,您将实现与读取主机和写入主机(可能使用 console.readline)的用户交互的功能。

于 2013-03-27T20:10:04.517 回答