Возьмём немного javascript. Примешаем его к PS
$url = 'https://github.com/'
&mshta ("javascript:new ActiveXObject('WScript.Shell').Run('explorer `"" + $url + "`",0,false');close()")
Или так:
$url = 'https://github.com/'
Invoke-Expression "$env:windir\explorer.exe $url";
Этот код открывает страницу в браузере по умолчанию
Вот код для открытия непосредственно в Chrome, даже если он стоит не по умолчанию
$url = 'https://github.com'
$path = 'HKLM:\SOFTWARE\Classes\ChromeHTML\shell\open\command'
if(Test-Path -Path $path -ErrorAction SilentlyContinue){ # $chrome
$chrome = ((Get-ItemProperty $path).'(Default)' -replace '%1',$url)
$exeName='\chrome.exe'
$index=($chrome.IndexOf($exeName)+$exeName.length+1)
Start-Process $chrome.Substring(0,$index) $chrome.Substring($index)
}else{
Start-Process $url
}
Аккуратно закрыть сложнее. Примешаем к PS Win32. Вот код для Chrome, хотя судя по коду подойдёт для всего, даже не браузерного. (Gracefully closing Chrome.ps1):
function Close-Window{
param([Parameter(Mandatory=$true)][Int] $myPID,[Parameter(Mandatory=$false)][System.IntPtr][Int] $hwnd)
$src = @'
using System;
using System.Runtime.InteropServices;
public static class Win32 {
public static uint WM_CLOSE = 0x10;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}
'@
Add-Type -TypeDefinition $src
$zero = [IntPtr]::Zero
if ($hwnd -eq 0 -or $hwnd -eq $null){
try{ # if (get-process | where {$_.Id -eq $myPID}){} # это бесполезно, не те скорости
$proc=Get-Process -Id $myPID
[System.IntPtr][Int]$hwnd = (Get-Process -Id $myPID).MainWindowHandle
}catch{}
}
if($hwnd){[Win32]::SendMessage($hwnd, [Win32]::WM_CLOSE, $zero, $zero) > $null}
}
function closeChrome($cromePath){
$unique=@()
if ( -not (get-process | where {$_.ProcessName -eq 'chrome'})){
}else{
foreach ($parentId in (Get-Process 'chrome').Id ){
$unique+=(gwmi win32_process -Filter ('processid='+$parentId)).ParentProcessId
}
$PPIDs=$unique|group|where Count -eq 1
$dopString='';foreach($PPID in $PPIDs.Name){$dopString=$dopString+' OR ParentProcessID = '+$PPID}$dopString=$dopString.Substring(4)
$m = Get-WmiObject -Class win32_process -Filter $dopString
$dopString='';foreach($Name in $PPIDs.Name){$dopString=$dopString+' AND NOT ParentProcessID = {0} AND NOT ProcessID = {0}' -f $Name}
while (($p = Get-WmiObject -Class win32_process -Filter ('Name = ''chrome.exe''{0}' -f $dopString)) -eq $null) { Start-Sleep -Milliseconds 100 }
foreach($el in $m,$p){
foreach($ChromePrc in $el){
if($ChromePrc.Path -eq $cromePath){
if($ChromePrc.ProcessId -eq $null){Start-Sleep -Seconds 1} #Chrome начал закрываться сам Попрообоапть Break?
if($ChromePrc.ProcessId -ne $null){try{$hwnd=([string](Close-Window $ChromePrc.ProcessId)).Split(' ')[-1]}catch{}} # некоторые процессы уже возможно будут закрыты
}
}
}
}
}
closeChrome 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
Давно, то ли сам писал, то ли глубоко переделывал чей-то не работающий код. Хром сейчас закрыть не могу для проверки. Помню, что работает. Берите как есть.
Сам писал. Нужно было отделить закрытие процессов Chrome.exe от процессов Chrome.exe Яндекса, Хромиума и других
Ну уже если нужно закрыть только открытую сейчас страницу, то вперёд. Рендерить страницы по названию окон. В коде перечисление уже есть. Осталось самое сложное )))