首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行C#自定义Cmdlet期间收集用户输入(而不是通过参数)

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

Stack Overflow用户
提问于 2013-03-27 19:40:06
回答 2查看 3.5K关注 0票数 3

我正在使用Google编写Cmdlet接口,并需要Oauth2身份验证。如果用户试图在没有经过身份验证的情况下运行Cmdlet,而且它不仅仅是刷新令牌,我需要他们输入浏览器提供的访问代码。(一切都搞定了。)当需要时,我想暂停cmdlet,等待它们的输入,然后只在验证后继续。

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

我一直在寻找一种方法来调用类似于C#的Console.Readline (在执行cmdlet时只会跳过这一点)或尝试调用读取主机cmdlet;一旦我从用户那里获得访问代码,代码可以继续正常执行。我知道这不一定是'Powershell方式‘,但为了这些工具,我觉得这是用户最好的选择。

如果我尝试这种方法:

代码语言:javascript
复制
ReadHostCommand read = new ReadHostCommand();
read.prompt = "Access Code";
foreach (string s in read.Invoke<string>()) {
    WriteObject(s);
}

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

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

代码语言:javascript
复制
PowerShell ps = PowerShell.Create();
ps.AddCommand("Read-Host");
foreach (PSObject result in ps.Invoke()) {
    WriteObject(result);
}

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

是否有方法暂停cmdlet以从用户处获取字符串?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-04 15:58:09

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

票数 6
EN

Stack Overflow用户

发布于 2013-03-27 20:10:04

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15667944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档