我的公司使用一个旧的命令行工具将日志文件部署到各种服务器....不管是谁写的,都写得非常非常重复。
有很多提示发生,我想自动化这个过程。我们的长期目标是替换这个。exe文件,但目前自动化工作在短期内…
例子./logdeploy.exe
Enter the destination folder:
我希望powershell脚本自动进入文件夹,因为它实际上是同一个文件夹。因为这个exe在整个过程中至少会请求它20次,所以复制粘贴只会得到任何东西。
这是可能的吗?
如果真的没有办法模拟交互式用户输入以使您的外部程序自动化,那么可以在以下假设下找到解决方案:
-
您的外部程序从stdin读取交互式响应(标准输入流)。
- 虽然这样做是典型的,但可以想象,给定程序的安全敏感的提示(例如密码)故意只接受来自终端的输入,以便明确防止自动执行响应。
-
如果第一个假设成立,必须使用的特定方法通过stdin发送响应字符串取决于外部程序是否在每个提示符之前清除键盘缓冲区。.
-
(a)如果不,您可以简单地在一个操作中发送所有字符串。
-
(b)如果确实,则需要在发送单个字符串之间插入延迟,以确保仅在外部程序主动提示输入时才发送输入。
- 这种方法本质上是脆弱的,因为在无法检测的情况下,当读取外部程序以读取提示响应时,您必须猜测发送响应之间需要多长时间-并且该时间可能根据许多运行时条件而变化。为了获得更好的可靠性,最好使用更长的延迟,但是,这会导致总体运行时间增加。
-
(a)的实现:
正如zett42和Mathias R. Jessen建议的那样,使用以下命令将字符串C:foo
和somepass
发送20次到外部程序的stdin流:
('C:foo', 'somepass') * 20 | ./logdeploy.exe
同样,这里假设./logdeploy.exe
缓冲键盘输入,它在显示下一个提示符之前接收到。
(b)的实现:
注意:下面的只在PowerShell (Core) 7+中有效,因为只有命令输出被正确地发送到外部程序流(逐行发送,当它变得可用时);不幸的是,Windows PowerShell首先收集所有输出。
# PowerShell 7+ only
# Adjust the Start-Sleep intervals as needed.
1..20 | ForEach-Object {
Start-Sleep 1
'C:foo'
Start-Sleep 2
'somepass'
} | ./logdeploy.exe