我正在编写与Google Apps API接口并需要Oauth2身份验证的Cmdlet。如果用户尝试在未经过身份验证的情况下运行Cmdlet,并且不仅仅是刷新令牌,我还需要他们输入从浏览器提供的访问代码。 (这一切都得到了解决。)我想在必要时暂停cmdlet,等待他们的输入,然后只有经过验证才能继续。
但是,我现在只能通过抛出一个错误来退出当前的Cmdlet,然后指示用户将访问代码作为参数传递给另一个Cmdlet(笨重)。
我一直在寻找一种方法来调用类似C#的Console.Readline(这只是在执行cmdlet时跳过)或尝试invoke the Read-Host cmdlet;一旦我从用户那里获得访问代码,代码就可以继续正常执行。我知道它不一定是'Powershell Way',但是为了这些工具,我觉得这是用户的最佳选择。
如果我尝试这种方法:
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执行中获取输入。
答案 0 :(得分:5)
如果您的cmdlet派生自PSCmdlet,则使用this.InvokeCommand.InvokeScript()
调用Read-Host
cmdlet。或者您可以使用this.Host.UI.Prompt*/Read*()
方法。
答案 1 :(得分:0)
听起来你真的需要实现PSHost(以及PSHostUserInterface和PSHostRawUserInterface类)。这样,您将实现与读取主机和写主机(可能使用console.readline)的用户交互的功能。