Альтернатива задержке при установке exe через PowerShell?

У меня есть программа, которую я пытаюсь установить через PowerShell. Работает нормально. я использую SendKeys для навигации по установке GUI. Я дал задержку между двумя SendKeys команды, потому что программное обеспечение занимает некоторое время между двумя шагами, но это время установки варьируется от компьютера к компьютеру.

У меня вопрос, как я могу обойти эту зависимость задержки в SendKeys? я пытался AppActivate но это бесполезно для меня. Есть ли альтернатива задержке?

1 ответ

Конечно.

Я преобразовал функцию C# Нитеша в скрипт Powershell

$signature_user32_GetForegroundWindow = @"
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
"@

$signature_user32_GetWindowText = @"
[DllImport("user32.dll")]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
"@

$foo = `
    Add-Type -MemberDefinition $signature_user32_GetForegroundWindow `
        -Name 'user32_GetForegroundWindow' `
        -Namespace 'Win32' `
        -PassThru

$bar = `
    Add-Type -MemberDefinition $signature_user32_GetWindowText `
        -Name 'user32_GetWindowText' `
        -Namespace 'Win32' `
        -Using System.Text `
        -PassThru

[int]$nChars = 256
[System.IntPtr] $handle = New-object 'System.IntPtr'
[System.Text.StringBuilder] $Buff = New-Object 'System.Text.StringBuilder' `
    -ArgumentList $nChars

$handle = $foo::GetForegroundWindow()
$title_character_count = $bar::GetWindowText($handle, $Buff, $nChars)
If ($title_character_count -gt 0) { Write-Output $Buff.ToString() }

Здесь много чего происходит. Позвольте мне немного объяснить, что я сделал.

  1. Я создал две сигнатуры метода (бит здесь-строки); один для каждой функции, которую мы вызываем.
  2. Я использую эти подписи для создания соответствующих типов. Опять же, по одному на каждый метод.
  3. Для GetWindowType (который передает заголовок обратно в строке и нуждается в ссылке на System.Text), я передаю System.Text пространство имен в -Using параметр.
  4. За кулисами PowerShell добавляет ссылки на System а также System.Runtime.InteropServices так что не нужно беспокоиться о них.
  5. Я создаю свой размер строки ($nChars), указатель окна ($handle) и буфер заголовка окна ($Buff)
  6. Я вызываю функции через указатель типа: $foo... а также $bar...

Вот что я получаю, когда запускаю все это...

Всякий раз, когда мне нужно вызвать Windows API (что на самом деле не мое), я ссылаюсь на следующие две статьи:

Надеюсь, это поможет!

Другие вопросы по тегам