Альтернатива задержке при установке exe через PowerShell? - PullRequest
0 голосов
/ 13 июня 2018

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

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

1 Ответ

0 голосов
/ 18 июня 2018

Конечно.

Я конвертировал Функция Nitesh 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...

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

enter image description here

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

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

...