Альтернатива задержке при установке 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() }
Здесь много чего происходит. Позвольте мне немного объяснить, что я сделал.
- Я создал две сигнатуры метода (бит здесь-строки); один для каждой функции, которую мы вызываем.
- Я использую эти подписи для создания соответствующих типов. Опять же, по одному на каждый метод.
- Для GetWindowType (который передает заголовок обратно в строке и нуждается в ссылке на System.Text), я передаю
System.Text
пространство имен в-Using
параметр. - За кулисами PowerShell добавляет ссылки на
System
а такжеSystem.Runtime.InteropServices
так что не нужно беспокоиться о них. - Я создаю свой размер строки (
$nChars
), указатель окна ($handle
) и буфер заголовка окна ($Buff
) - Я вызываю функции через указатель типа:
$foo...
а также$bar...
Вот что я получаю, когда запускаю все это...
Всякий раз, когда мне нужно вызвать Windows API (что на самом деле не мое), я ссылаюсь на следующие две статьи:
- PowerShell P / Invoke Пошаговое руководство.
- Использование PowerShell для взаимодействия с Windows API: Часть 1
Надеюсь, это поможет!