如何让 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 的答案,要么没有帮助:
- How to fill the prompt in powershell script
- How to "answer" a console input prompt in PowerShell (in the code)
- How to write to user input in powershell
不要使用 $input
作为变量名,因为它是 PowerShell 中的自动变量(参见 help about_Automatic_Variables
)。
确定可执行文件是否可以接受命令行参数而不是停止或提示输入。如果可用,这显然是首选。
是否可以告诉 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}")
我有一个 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 的答案,要么没有帮助:
- How to fill the prompt in powershell script
- How to "answer" a console input prompt in PowerShell (in the code)
- How to write to user input in powershell
不要使用
$input
作为变量名,因为它是 PowerShell 中的自动变量(参见help about_Automatic_Variables
)。确定可执行文件是否可以接受命令行参数而不是停止或提示输入。如果可用,这显然是首选。
是否可以告诉 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}")