我正在使用Google编写Cmdlet接口,并需要Oauth2身份验证。如果用户试图在没有经过身份验证的情况下运行Cmdlet,而且它不仅仅是刷新令牌,我需要他们输入浏览器提供的访问代码。(一切都搞定了。)当需要时,我想暂停cmdlet,等待它们的输入,然后只在验证后继续。
但是,我现在只能抛出一个错误退出当前的Cmdlet,然后指示用户将访问代码作为参数传递给另一个Cmdlet (clunky)。
我一直在寻找一种方法来调用类似于C#的Console.Readline (在执行cmdlet时只会跳过这一点)或尝试调用读取主机cmdlet;一旦我从用户那里获得访问代码,代码可以继续正常执行。我知道这不一定是'Powershell方式‘,但为了这些工具,我觉得这是用户最好的选择。
如果我尝试这种方法:
ReadHostCommand read = new ReadHostCommand();
read.prompt = "Access Code";
foreach (string s in read.Invoke<string>()) {
WriteObject(s);
}我得到了一个错误:不能直接调用从派生的PSCmdlet Cmdlet。
搜索该错误会导致我尝试创建一个新的 宿主对象,如下所示,我得到了另一个错误(也如下所示):
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执行中获得输入。
发布于 2013-04-04 15:58:09
如果您的cmdlet派生自PSCmdlet,则使用this.InvokeCommand.InvokeScript()调用Read-Host cmdlet。或者您可以使用this.Host.UI.Prompt*/Read*()方法。
发布于 2013-03-27 20:10:04
听起来您实际上需要实现PSHost (以及PSHostUserInterface和PSHostRawUserInterface类)。在这样做时,您将实现与用户交互的功能,与读主机和写主机交互(可能使用console.readline)。
https://stackoverflow.com/questions/15667944
复制相似问题