我正在编写与 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 获取输入。