我正在努力自动化在我的工作中完成一些繁琐的任务。我没有管理员权限,所以我无法下载/安装任何东西。我可以使用的只是Windows PowerShell或其他本机Windows程序。
现在我遇到了让PowerShell暂停自己直到程序完全打开的问题。我正在尝试在我的本地桌面上打开一个程序,并让PwerShell为我登录。我可以使用-wait或start-sleep,但这些计算机都很旧。有时它们需要5秒才打开,其他时间需要5分钟。
在继续运行脚本之前,是否有办法告诉PowerShell检查程序是否已完全加载?
PowerShell V1.0 BTW
答案 0 :(得分:0)
这是我刚才问自己的事情,碰巧碰到了你的问题。我意识到我的回答相当晚,但我想如果其他人偶然发现你的这个问题,我会发布一些内容。我做了一些挖掘,我认为以下代码片段可能对您有用:
$appProcess = Start-Process -FilePath "INSERT_PATH_TO_APP_EXE_HERE" -PassThru
$applicationStarted = $False
$stopCheckTime = (Get-Date).AddMinutes(1)
While (!$applicationStarted -and (Get-Date) -lt $stopCheckTime)
{
Start-Sleep -Seconds 10
$tempProc = Get-Process -Id $appProcess.Id
$applicationStarted = $tempProc.MainWindowHandle -ne 0 -and ![string]::IsNullOrWhitespace($tempProc.MainWindowTitle)
}
if ($applicationStarted)
{
# Do whatever you need to do once the application is launched
}
else
{
# Log/raise error
}
要解释发生的情况,当启动用户界面应用程序(例如记事本)时,进程的MainWindowHandle
指针值将为非零,并且通常为进程的MainWindowTitle
属性将在其中有一个字符串值(例如记事本)。当我最初使用Start-Process
启动应用程序时,我指定PassThru
标志,以便我可以立即获取进程ID,然后允许我定期检查应用程序是否正在运行。
使用我使用此代码段的应用程序,应用程序需要一些时间来启动(2秒或左右),因为它必须在启动期间建立与本地数据库的连接,以及制作一些HTTP在将应用程序呈现给用户之前调用。因此,为什么我在While
循环中进行此检查,我在1分钟内每隔10秒检查一次。