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

标签 c# powershell input powershell-cmdlet

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

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

我一直在寻找一种方法来调用类似 C# 的 Console.Readline(这在执行 cmdlet 时被跳过)或尝试 invoke the Read-Host cmdlet ;一旦我从用户那里获得访问代码,代码就可以继续正常执行。我知道这不一定是“Powershell 方式”,但为了这些工具,我觉得它是用户的最佳选择。

如果我尝试这种方法:

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

我收到一个错误:无法调用派生自 PSCmdlet 的 Cmdlet 直接。

搜索导致我尝试的错误 creating a new Host object如下我得到另一个错误(也如下):

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,并且需要在执行 cmdlet 的过程中从用户那里获取输入。

最佳答案

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

关于c# - 在执行 C# 自定义 Cmdlet 期间收集用户输入(不通过参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15667944/

相关文章:

html - 触发文本区域中的输入

javascript - 在 div 中仅添加某些输入

c# - 如何在 C# 中使用 XMLREADER 从 XML 字符串中读取特定元素

c# - 无法在 ASP.NET C# 项目中保存用于条形码生成的图像

c# - 投 listView.SelectedIndices 到 List<int>

c# - 如何确定可执行文件是针对哪个平台编译的?

Android - 在自定义 EditText 上捕获退格(删除)按钮

c# - 如何在删除 {} 括号时阻止 VisualStudio 展开所有内容

powershell - PowerShell Set-ItemProperty与点设置属性

powershell - 如何将带有空格的参数作为数组传递给 Powershell 中的 RoboCopy?