【问题标题】:Powershell - Interact with executable's command line prompts?Powershell - 与可执行文件的命令行提示交互?
【发布时间】:2017-05-08 15:52:03
【问题描述】:

我需要针对旧版应用程序自动执行一些任务。它没有 API,但供应商提供了一个 .exe,我可以运行它来针对应用程序执行各种任务。

我可以从 PowerShell 中调用 .exe 就好了,但调用它后会提示输入以下内容:

您是否同意许可:是 用户名:myuid 密码:SuperSecretPassword`

我可以从命令提示符交互地运行它,并根据提示手动输入请求的输入,但我需要在脚本中自动执行此操作。 .exe 也不接受任何命令行参数(它是一个旧应用程序),我可以传递的唯一参数是我想对应用程序执行的命令。 .exe 仅基于命令行,没有 GUI,因此 GUI 自动化工具也不是一个选项。

我可以在 *nix shell 中使用expect 轻松完成此操作,但是鉴于我需要运行一个 .exe,这是不可能的。 Windows 中似乎没有“期望”等价物,所以我很好奇这是否可以在 PowerShell 中完成?

注意:对于 Windows 脚本,我更喜欢 PowerShell,但必要时可以使用 VBScript。

【问题讨论】:

标签: powershell automation expect


【解决方案1】:

如果我没记错的话,如果它只是一行,你可以将一个字符串传递给一个 exe,例如。 "asdf" | example.exe,但您可能需要使用 SendKeys 进行多行输入

Add-Type -AssemblyName 'System.Windows.Forms'
$ID = (Start-Process example.exe -PassThru).id 
Sleep 1
Add-Type -AssemblyName Microsoft.VisualBasic 
[Microsoft.VisualBasic.Interaction]::AppActivate([Int32]$ID)
[System.Windows.Forms.SendKeys]::SendWait("YES~")
[System.Windows.Forms.SendKeys]::SendWait("myuid~")
[System.Windows.Forms.SendKeys]::SendWait("SuperSecretPassword~")

【讨论】:

  • 否定。 Start-Process 在单独的命令提示符窗口中打开命令,然后 SendKeys 命令将输入​​发送到我启动它的 PowerShell 窗口。
  • 我也试过不使用 Start-Process 命令,可执行文件运行,提示我输入。我手动输入了所有输入,可执行文件完成了它,完成后,SendKeys 命令将 3 个字符串输出到 PowerShell 提示符。
  • 您可能需要使用$ID = (Start-Process -PassThru).id Add-Type -AssemblyName Microsoft.VisualBasic [Microsoft.VisualBasic.Interaction]::AppActivate("$ID")
  • 这是有道理的,但是当我尝试它时,我收到以下错误:使用“1”参数调用“AppActivate”的异常:“找不到进程'14264'。”但是有趣的是,如果我在计算机上打开任务管理器并找到 .exe,它在 PID = 14264 下运行,所以我不确定为什么 PowerShell 找不到它。
  • 一个小测试让我意识到AppActivate 的两个问题首先是ID 用引号引起来,它是一个字符串,而String 重载会查找窗口标题。所以我们需要转换为Int32。其次,没有睡眠,appactivate 在窗口准备好之前就关闭了。
猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
相关资源
最近更新 更多