PowerShell是一种强大的脚本语言,它可以帮助自动化许多任务。然而,在某些情况下,应用程序可能会弹出窗口要求用户输入或确认操作。本文将介绍一种方法,通过PowerShell脚本在无需用户干预的情况下自动关闭这些确认窗口。
本文的解决方案基于PowerShell 7.1.3版本。在自动化过程中,可能会遇到需要用户确认的对话框,这些对话框会阻塞脚本的执行,直到用户手动关闭它们。例如,在尝试信任ASP.NET Core HTTPS开发证书时,运行命令:
dotnet dev-certs https --trust
该命令会输出结果,并弹出一个对话框要求用户确认或取消操作。
需要一个能够在无人值守模式下运行的PowerShell脚本,但是其中一个命令会显示对话框窗口,要求用户确认或取消操作。显然,这个窗口会阻塞脚本,直到用户关闭它。
将创建一个名为close-windows.ps1
的脚本,以解决这个阻塞问题。PowerShell允许编写命令来寻找窗口并向其发送按键。这意味着主要命令和关闭窗口命令应该作为后台任务并行执行。任务启动后,主脚本会继续执行,并等待直到任务完成或超时。然后,如果有挂起的任务,它会停止这些任务并输出执行结果。
以下是close-windows.ps1
脚本的示例:
PowerShell
param
(
[Parameter(Mandatory = $true)]
[ScriptBlock]$Command = { Write-Host 'Run command'; },
[Parameter(Mandatory = $true)]
[string]$WindowName,
[Parameter(Mandatory = $false)]
[Int16]$MaxAttempts = 10,
[Parameter(Mandatory = $false)]
[Int16]$Delay = 5
)
...
脚本通过寻找窗口并发送按键来关闭它。它创建了一个名为wscript.shell
的对象,并尝试通过窗口名称来寻找窗口。如果找到了窗口,脚本会发送按键序列,例如Tab和Enter,以将焦点移动到“是”按钮并点击它。
脚本接受以下参数:
$Command
:作为后台任务运行的命令。$WindowName
:要关闭的窗口的名称,不能为空或空字符串。$MaxAttempts
:确认操作的尝试次数。这是一个可选参数,默认值为10次。$Delay
:尝试之间的延迟时间(秒)。这是一个可选参数,默认值为5秒。脚本启动两个后台任务,并将它们的ID存储在数组中,因为当前会话可能包含其他具有相同名称的任务。一旦任务在后台执行,主脚本会等待任务完成,但会意识到任务可能会挂起。
脚本有一些缺点:
-NoNewWindow
开关运行Start-Process
,Start-Job
可能会失败,因此需要一个变通方法。