PowerShell脚本自动化处理确认窗口

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存储在数组中,因为当前会话可能包含其他具有相同名称的任务。一旦任务在后台执行,主脚本会等待任务完成,但会意识到任务可能会挂起。

注意事项

脚本有一些缺点:

  • 它通过窗口名称来搜索对话框窗口,这可能会产生错误的结果。
  • 用户操作窗口可能会中断脚本。
  • 按键序列是硬编码的,例如Tab和Enter。
  • 如果需要使用-NoNewWindow开关运行Start-ProcessStart-Job可能会失败,因此需要一个变通方法。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485