Задать вопрос
@andreystrelkov

Как в Powershell открыть URL и закрыть после этого браузер?

Добрый день, когда открываю ссылку с помощью Powershell, допустим для открытия уникальной ссылки крона сайта, у меня открывается как обычно браузер и всё нормально, но при этом браузер остаётся открытым, соответственно когда ещё раз по шелдуллеру запускается скрипт, он открывает ещё один браузер, т.о. кол-во их увеличивается и становится не фен-шуй.

Можно ли как открыть ссылку не запуская ничего, т.е. подать некий запрос может, или тупо открывать через браузер а потом через некоторое время убивать скриптом процесс браузера?
  • Вопрос задан
  • 6721 просмотр
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
ace_foster
@ace_foster
Можно ничего не качать. Всё доступно через PowerShell

$ie_procinfo = Start-Process iexplore -ArgumentList 'google.com' -passthru
$ie_procid = $ie_procinfo.id #сохраняем id запущеного процесса в переменную

Stop-Process -Id $ie_procid -Force # убиваем запущеный процесс по сохраненному id
Ответ написан
Комментировать
@azarij
В меру опытный никто
invoke-webrequest -uri <ссылка> -method get
Ответ написан
Комментировать
@Igor_Ya
Возьмём немного 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 Яндекса, Хромиума и других
Ну уже если нужно закрыть только открытую сейчас страницу, то вперёд. Рендерить страницы по названию окон. В коде перечисление уже есть. Осталось самое сложное )))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы