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

    @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 Яндекса, Хромиума и других
    Ну уже если нужно закрыть только открытую сейчас страницу, то вперёд. Рендерить страницы по названию окон. В коде перечисление уже есть. Осталось самое сложное )))
    Ответ написан
    Комментировать
  • Ввод данных за пределами файла, в чем причина?

    @Igor_Ya
    Это ошибка изменения переменных другим процессом. Возможно вы не закрыли поток FileSystemObject.
    Ответ написан
    Комментировать
  • Как сконвертировать из ISO-8859 в utf-8?

    @Igor_Ya
    Если вам просто прочитать, то можно установить Notepad++, открыть ваши крякозябры и перейти в нужную русскую кодировку. Нужные кодировку в большинстве случаев можно выудить на сайте www.online-decoder.com/ru. Причём - это пожалуй единственный сайт, который находит ответ из скопированных в него крякозябров. Ну ... или сразу там получить текст. Обычно это Windows 1251. И вуаля. Копируете русский текст в новый текстовый файл с настроенной русской кодировкой или utf-8 для дальнейшего использования. ISO-8859-1 легко поддерживает эту операцию. Ну да, желательно открывать копию файла, Notepad++ иногда просит сохранить файл и при неправильных действиях это чревато потерей данных.
    Ответ написан
    Комментировать
  • Как активировать окно exe программы и нажать на кнопку?

    @Igor_Ya
    $wshell = New-Object -ComObject wscript.shell;
    $winName='Безымянный — Блокнот'
    $rez=$wshell.AppActivate($winName);
    $rez
    Ответ написан
    Комментировать
  • Как с помощью Powershell установить соединение PPPoE?

    @Igor_Ya
    К сожалению это выводит лишь окошечко подключения, за которым ещё окошечко и т.д. Это не подключает.
    Хотя в Windows 8 это окно выводило на подключению сразу, без новых безумных metro окон.

    $itemName = 'Ростелеком'
    $pressIt = 'Подкл&ючить/отключить'
    $sa = New-Object -ComObject Shell.Application
    $sa.NameSpace(49).Items() | foreach ({
        if($_.Name -eq $itemName){
            $_.Verbs() | foreach ({
                if ($_.name -eq $pressIt){
                    $_.DoIt()
                    break
                }
            })
        }
    })


    Похоже сам запрос "не прибегая к rasphone.exe и rasdial.exe" бессмысленен ... по крайней мере в отношении к rasdial.exe.
    Дело в том, что судя по всему, он просто является "входными воротами" в процесс программного подключения, если пользователь пожелает это сделать. И дальнейший его путь пойдёт теми же dll-ками и исполняемыми файлами, которые активируются стандартным нажатием кнопки подключить.
    Простейший скрипт Powershell
    $x='Ростелеком'
    $a='login';
    $b='password';
    $c=$env:WINDIR+'\System32\rasdial.exe';
    &$c @($x,$a,$b) 2>&1|ForEach{
             $_
    };

    выведет вам ровно те же ошибки и сообщения, которые вы видите при обычном подключении.
    То, что нужно вводить имя подключения Ростелеком к примеру - ни о чём не говорит, его можно взять из реестра.
    HKEY_USERS\'+ваш GUID+'\Software\Microsoft\RAS Phonebook
    параметр DefaultEntry - Подключение по умолчанию.
    Ну а логин и пароль - чтобы все программы массово не стали ломиться в открытые ворота.
    Важно, если не хотите увидеть крякозябры, не запускайте в среде powershell ISE.
    Запуск стандартным Powershell файла ps.1 при помощи ярлыка
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -ExecutionPolicy Bypass -File "G:\mypath\name.ps1"
    Ответ написан
    Комментировать
  • UTF-8 vs UTF-8 без BOM - что когда использовать?

    @Igor_Ya
    Bom - спецификация для NET языков.
    В Powershell у меня крякозябры для русского языка, после пересохранения безбомовского файла в любой из форматов, будь-то, бом-безбом или, что либо-другое.
    Были, как то ранее проблемы с web js то же.
    Ответ написан
    Комментировать
  • Возможно ли создать .bat файл для быстрого извлечения флешки?

    @Igor_Ya
    Только, что написал. Прямо из печки.
    Без использования временных файлов. Извлечёт все диски на флэшке (эммм - до 5 дисков), даже если они не читаются Виндой и не имеют в данный момент присвоенного имени диска.
    Просто положить батник в кодировке OEM 866 на флэшку.
    chcp 866
    @echo off
    setlocal enabledelayedexpansion
    set N=%~d0
    mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""cmd /v /c cd /d c:&for /l %%n in (0,1,5) do ( for /f """"usebackq"""" %%i in (`wmic logicaldisk where """"Name='!N!'"""" get DriveType`) do (if %%i==2 (mshta """"vbscript:CreateObject(""""Scripting.FileSystemObject"""").GetStandardStream(1).Write(CreateObject^(""""Shell.Application""""^).NameSpace^(17^).ParseName^(""""!N!""""^).InvokeVerb^(""""Eject""""^))&Close()"""")))"",0,false:close")

    Если кому надо из винды, то вариант для понимания попроще. Просто замените значение переменной ImyaFleshki на нужное. С флэшки не работает.
    chcp 866
    @echo off
    set "ImyaFleshki=Clover"
    set operation=Eject
    set fname=%~n0
    setlocal enabledelayedexpansion
    for /f "tokens=2 delims==" %%a in ('wmic logicaldisk where "DriveType=2 and VolumeName='%ImyaFleshki%'" get Name /value^|find "="') do (
    set Name=%%a
    :loop
    for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "Name='!Name!'" get Description /value^|find "="') do set Description=%%i
    for /f tokens^=1^ delims^=^" %%a in ("!Description!") do set Description=%%a
    if "!Description!"=="Removable Disk" (
    call :disconnect !Name! %operation% ret
    set "Description="
    goto :loop
    ) else ( call :msgBox "Ваше устройство '!ImyaFleshki!' отсоединено от компьютера. Теперь вы можете безопасно извлечь его."
    goto :eof)
    )
    call :msgBox "Устройство '!ImyaFleshki!' не обнаружено в файловой системе."
    setlocal disabledelayedexpansion
    goto :eof
    :disconnect [DirName] [Operation] [ret]
    set command=CreateObject("Shell.Application").NameSpace(17).ParseName("%~1").InvokeVerb("%~2")
    SetLocal EnableExtensions
    for /f "UseBackQ tokens=* delims=" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(%command%)&Close()"`) do set "%~3=OK"
    SetLocal DisableExtensions
    exit /B
    :msgBox [msgText]
    PowerShell -Command^
    "[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"^
    "[System.Windows.Forms.MessageBox]::Show(\"%~1\", 'Извлечение флэш накопителя','OK','Exclamation')"
    set %~2=OK
    exit /B

    Ну ... и извлечь все флэшки. Работать правильно будет только из Винды. Если лежит на флэшке - извлечёт только "чужие" накопители.
    chcp 866
    @echo off
    set operation=Eject
    setlocal enabledelayedexpansion
    for /f "tokens=2 delims==" %%a in ('wmic logicaldisk where "DriveType=2" get Name /value^|find "="') do (
    		set Name=%%a
    		:loop
    		for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "Name='!Name!'" get Description /value^|find "="') do set Description=%%i
    		for /f tokens^=1^ delims^=^" %%a in ("!Description!") do set Description=%%a
    		if "!Description!"=="Removable Disk" (
    			call :disconnect !Name! %operation% ret
    			set "Description="
    			goto :loop
    		) else ( call :msgBox "Вы можете безопасно извлечь все флэшки."
    				goto :eof)
    )
    call :msgBox "В файловой системе не обнаружено флэш карт."
    setlocal disabledelayedexpansion
    goto :eof
    :disconnect [DirName] [Operation] [ret]
      set command=CreateObject("Shell.Application").NameSpace(17).ParseName("%~1").InvokeVerb("%~2")
      SetLocal EnableExtensions
      for /f "UseBackQ tokens=* delims=" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(%command%)&Close()"`) do set "%~3=OK"
      SetLocal DisableExtensions
    exit /B
    :msgBox [msgText]
    PowerShell -Command^
     "[Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')|Out-Null;"^
     "[System.Windows.Forms.MessageBox]::Show(\"%~1\", 'Извлечение флэш накопителя','OK','Exclamation')"
    set %~2=OK
    exit /B
    Ответ написан
    Комментировать