【问题标题】:Pause windows powershell until Application opens fully暂停 windows powershell 直到应用程序完全打开
【发布时间】:2017-03-08 14:21:02
【问题描述】:

我正在尝试自动化我工作中的一些乏味任务。我没有管理员权限,所以我无法下载/安装任何东西。我只能使用 Windows PowerShell 或其他本机 Windows 程序。

现在我遇到了让 PowerShell 自行暂停直到程序完全打开的问题。我正在尝试在本地桌面上打开一个程序,并让 PwerShell 为我登录。我可以使用 -wait 或 start-sleep,但这些计算机很旧。有时需要 5 秒才能打开,有时需要 5 分钟。

有没有办法告诉 PowerShell 在继续运行脚本之前检查程序是否已完全加载?

PowerShell V1.0 顺便说一句

【问题讨论】:

  • 您必须使用本机 Win32 调用来获取另一个应用程序的状态。这意味着您需要使用PInvoke,这在PowerShell 中意味着您需要create a custom type。我不知道 PowerShell v1.0 是否可以做到这一点。我记得它有很大的局限性。
  • 谢谢。希望我可以在 python 中编写代码。 -.-

标签: powershell


【解决方案1】:

这是我刚才问自己的事情,碰巧遇到了你的问题。我意识到我的回复比较晚,但我想我会发布一些东西,以防其他人偶然发现你的这个问题。我做了一些挖掘,我认为以下代码 sn-p 可能对您有用:

$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,然后我可以定期检查应用程序是否正在运行。

对于我使用此代码 sn-p 的应用程序,该应用程序需要一些时间来启动(2 秒左右),因为它必须在启动期间建立与本地数据库的连接,以及在将应用程序呈现给用户之前进行一些 HTTP 调用。因此,为什么我在 While 循环中进行此检查,我在 1 分钟内每 10 秒检查一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多