如何让 Powershell 脚本回答用户输入的提示?

How to make a Powershell script answer a prompt for user input?

我有一个 Powershell 脚本需要执行提示用户输入的命令行可执行文件(没有命令行参数)。像这样:

# promptsForInput.ps1
$someInput = Read-Host "Gimme some input"
# do something with $someInput

实际的可执行文件是一个编译后的二进制文件,我无法修改,但是这个示例脚本是为了解决这个问题。我的 Powershell 脚本调用可执行文件:

# myScript.ps1
.\promptsForInput.ps1

在运行时,系统提示我输入一些内容:

> .\myScript.ps1
Gimme some input:

我需要能够在没有用户干预的情况下填写该输入请求。当 promptsForInput.ps1 提示用户输入时,我需要 myScript.ps1 输入所需的值并继续执行脚本。

关于 SO 的类似问题要么有特定于特定 exe 的答案,要么没有帮助:

  1. 不要使用 $input 作为变量名,因为它是 PowerShell 中的自动变量(参见 help about_Automatic_Variables)。

  2. 确定可执行文件是否可以接受命令行参数而不是停止或提示输入。如果可用,这显然是首选。

  3. 是否可以告诉 PowerShell 自动将输入发送到任意可执行文件取决于该可执行文件的设计。如果可执行文件允许您向其发送标准输入,您可以 运行 类似于

    "test" | myexecutable.exe
    

    在此示例中,PowerShell 将提供字符串 test 和 return 作为可执行文件的标准输入。如果可执行文件接受标准输入,那么这将起作用。

    如果可执行文件使用标准输入,那么您将不得不做一些不同的事情,比如将击键发送到window。我认为发送击键是最后的手段,也是一种不适合自动化的脆弱解决方案。

以下示例我曾经 运行 批处理文件并提供输入

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
Start-Process -FilePath C:\myexecbatchfile.bat

# Wait the application start for 2 sec 
Start-Sleep -m 2000
 
# Send keys
[System.Windows.Forms.SendKeys]::SendWait("input1")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
Start-Sleep -m 3000

[System.Windows.Forms.SendKeys]::SendWait("input2")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")