Есть ли способ получить идентификатор процесса окна браузера?, когда у меня открыто несколько окон браузера?
$windowTitle='Facebook(.*?)'
Get-Process | Where-Object {$_.mainWindowTitle -match $windowtitle} |
Format-Table Id, Name, mainWindowtitle -AutoSize
При этом я могу искать только заголовок главного окна.
@Theo Нечего жаловаться на Facebook(.*?) полностью правильное регулярное выражение, проверьте объяснение на regex101.com, хотя часть (.*?) лишняя, если вы не использовать. коллекция спичек.
Вы имеете в виду отдельные окна или вкладки? Какая версия ИЕ? Эта статья может быть актуальной powertoe.wordpress.com/2010/11/10/…
@LotPings Ах, да, теперь я вижу. Должно быть, задремал или что-то в этом роде. Виноват.





Вы можете попробовать сослаться на скрипт PowerShell ниже, который даст вам идентификатор процесса каждого окна с его заголовком. Далее вы можете изменить сценарий в соответствии с вашими требованиями.
Пример скрипта:
$sig = @"
[DllImport("user32.dll", SetLastError=true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll")]
public static extern IntPtr GetTopWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
public enum GetWindow_Cmd : uint {
GW_HWNDFIRST = 0,
GW_HWNDLAST = 1,
GW_HWNDNEXT = 2,
GW_HWNDPREV = 3,
GW_OWNER = 4,
GW_CHILD = 5,
GW_ENABLEDPOPUP = 6
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
public static extern int GetWindowTextLength(IntPtr hWnd);
"@
Add-Type -MemberDefinition $sig -Namespace User32 -Name Util -UsingNamespace System.Text
$iethreads = get-process iexplore |?{!$_.MainWindowTitle} |%{$_.ID}
$p=0
$window = [User32.Util]::GetTopWindow(0)
while ($window -ne 0) {
[User32.util]::GetWindowThreadProcessId($window, [ref]$p) |out-null
if ($iethreads -contains $p) {
$length = [User32.Util]::GetWindowTextLength($window)
if ($length -gt 0) {
$string = New-Object System.Text.Stringbuilder 1024
[User32.Util]::GetWindowText($window,$string,($length+1)) |out-null
if ($string.tostring() -notmatch '^MSCTFIME UI$|^Default IME$|^SysFader$|^MCI command handling window$') {
new-object psobject -Property @{PID = $p;Title = $string.tostring()}
}
}
}
$window = [User32.Util]::GetWindow($window, 2)
}
Выход:
Ссылка:
Поиск потока (PID), принадлежащего вкладке в IE с помощью PowerShell
Вы используете шаблон Сравнение подстановочных знаков с оператором регулярное выражение
-match. В этом случае лучше использовать-like.