Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   запуск бат файла с указанием месторасположения окна (http://forum.oszone.net/showthread.php?t=255310)

Тимур_Макенов@vk 02-03-2013 13:06 2102489

запуск бат файла с указанием месторасположения окна
 
здравствуйте!
имеются 2 бат файла просто запускающие "ping" к указанному IP адресу. при запуске их поочередно одно окно накладывается на другое. приходиться ручками перемещать чтоб видеть оба окна параллельно. хотелось бы это автоматизировать. как это можно осуществить?

zion87 02-03-2013 18:58 2102709

создаешь ярлык на файл bat - ПКМ - свойства - расположение - положение окна
вводишь необходимое расположение....

также можно выбрать: шрифт, цвет и т.д.

Тимур_Макенов@vk 02-03-2013 19:47 2102746

Цитата:

Цитата zion87
создаешь ярлык на файл bat - ПКМ - свойства - расположение - положение окна
вводишь необходимое расположение....
также можно выбрать: шрифт, цвет и т.д. »

этим способом задается глобальное положение всех вызываемых окон командной строки. в моем же случае необходимо для каждого батника отдельное расположение окна

zion87 02-03-2013 21:51 2102825

Цитата:

Цитата Тимур_Макенов@vk
глобальное положение всех вызываемых окон командной строки »

с чего вы это взяли? Ярлык создается на каждый bat отдельно!!! И настройки в свойствах ярлыка индивидуальные!!!

Тимур_Макенов@vk 03-03-2013 00:53 2102928

Цитата:

Цитата zion87
с чего вы это взяли? Ярлык создается на каждый bat отдельно!!! И настройки в свойствах ярлыка индивидуальные!!! »

потому что это первое что пришло в голову, и я это испробовал. запускаешь 1 бат файл, заходим в свойство выставляем нужные нам значения в окне расположение. запускаем 2 бат файл, и проделываем те же пункты но толь расположение меняем так, чтоб не накладывалось на 1. ок, сделали. закрываем оба окна. запускаем по новой и вуаля! сохранены настройки 2-го бат файла и окна друг на друге!

Iska 03-03-2013 01:28 2102945

Цитата:

Цитата Тимур_Макенов@vk
запускаешь 1 бат файл, заходим в свойство »

Тимур_Макенов@vk, Вы что-то явно делаете не так. Сначала создаёте пакетные файлы. Затем создаёте на них ярлыки. Затем, не запуская пакетные файлы, настраиваете свойства созданных ярлыков, задавая разное расположение окон консоли. И только затем запускаете пакетные файлы через настроенные ярлыки.

Тимур_Макенов@vk 03-03-2013 02:27 2102982

Цитата:

Цитата Iska
Тимур_Макенов@vk, Вы что-то явно делаете не так. Сначала создаёте пакетные файлы. Затем создаёте на них ярлыки. Затем, не запуская пакетные файлы, настраиваете свойства созданных ярлыков, задавая разное расположение окон консоли. И только затем запускаете пакетные файлы через настроенные ярлыки. »

я вас понял, таким методом все получится, но есть один нюанс....
бат файлы я запускаю через специальные отведенные клавиши (клава такая мультимедийная). к сожалению при назначении клавише ярлыка к бат файлу (через ПО клавиатуры) такая фишка не действует))). если указать ярлык, то она его полностью игнорит, берет из ярлыка только ссылку к батнику и запускает его. по этому так важно указать в самом бат файле расположение окон

Iska 03-03-2013 04:22 2103006

Тимур_Макенов@vk, попробуйте WSH:
читать дальше »
Код:

Option Explicit

Const SW_NORMAL = 1

Dim objSWbemObjectEx_Win32_Process
Dim objSWbemObjectEx_Win32_ProcessStartup
Dim lngProcessID

Dim strPath1
Dim strPath2

strPath1 = "E:\Песочница\0231\0001.cmd"
strPath2 = "E:\Песочница\0231\0002.cmd"

With WScript.CreateObject("WbemScripting.SWbemLocator")
        With .ConnectServer(".", "root\cimv2")
                Set objSWbemObjectEx_Win32_Process        = .Get("Win32_Process")
                Set objSWbemObjectEx_Win32_ProcessStartup = .Get("Win32_ProcessStartup").SpawnInstance_
               
                With objSWbemObjectEx_Win32_ProcessStartup
                        .ShowWindow = SW_NORMAL
                        .CreateFlags = 16
                       
                        .X =  25
                        .Y = 100
                       
                        .XSize = 600
                        .YSize = 300
                       
                        .XCountChars = 40
                        .YCountChars = 3000
                       
                        .Title = "Ping 1"
                        .FillAttribute = 30
                End With
               
                If objSWbemObjectEx_Win32_Process.Create("""" & strPath1 & """", Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strPath1 & "]"
                        WScript.Quit 1
                End If
               
                With objSWbemObjectEx_Win32_ProcessStartup
                        .X = 650
                       
                        .Title = "Ping 2"
                        .FillAttribute = 91
                End With
               
                If objSWbemObjectEx_Win32_Process.Create("""" & strPath2 & """", Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strPath2 & "]"
                        WScript.Quit 2
                End If
        End With
End With

WScript.Quit 0


Если у Вас в пакетных файлах только «ping.exe» — можно обойтись и без пакетных файлов, указывая команду непосредственно; проще будет закрывать по Ctrl-C.

zion87 03-03-2013 08:39 2103033

Тимур_Макенов@vk,
Цитата:

Цитата Тимур_Макенов@vk
таким методом все получится »

а я предлагал какой то другой?

Тимур_Макенов@vk 03-03-2013 09:13 2103040

Цитата:

Цитата zion87
а я предлагал какой то другой? »

я вас сразу не понял, my bad))
но как я и сказал для меня этот способ не подходит...

Цитата:

Цитата Iska
Если у Вас в пакетных файлах только «ping.exe» — можно обойтись и без пакетных файлов, указывая команду непосредственно; проще будет закрывать по Ctrl-C. »

да у меня в батнике только одна команда ping. я так понял вы имели ввиду запускать пинг непосредственно через саму exe-шку (ping.exe). но чем это поможет для моего случая? можно указать расположение окна?

Iska 03-03-2013 09:33 2103045

Цитата:

Цитата Тимур_Макенов@vk
да у меня в батнике только одна команда ping. я так понял вы имели ввиду запускать пинг непосредственно через саму exe-шку (ping.exe). но чем это поможет для моего случая? »

Речь выше шла про пакетные файлы — я сделал для них.

А Вы попробуйте:
читать дальше »
Код:

Option Explicit

Const SW_NORMAL = 1

Dim objSWbemObjectEx_Win32_Process
Dim objSWbemObjectEx_Win32_ProcessStartup
Dim lngProcessID

Dim strCommandLine1
Dim strCommandLine2

strCommandLine1 = "ping.exe -t ya.ru"
strCommandLine2 = "ping.exe -t google.com"

With WScript.CreateObject("WbemScripting.SWbemLocator")
        With .ConnectServer(".", "root\cimv2")
                Set objSWbemObjectEx_Win32_Process        = .Get("Win32_Process")
                Set objSWbemObjectEx_Win32_ProcessStartup = .Get("Win32_ProcessStartup").SpawnInstance_
               
                With objSWbemObjectEx_Win32_ProcessStartup
                        .ShowWindow = SW_NORMAL
                        .CreateFlags = 16
                       
                        .X =  25
                        .Y = 100
                       
                        .XSize = 600
                        .YSize = 300
                       
                        .XCountChars = 40
                        .YCountChars = 3000
                       
                        .Title = "Ping 1"
                        .FillAttribute = 30
                End With
               
                If objSWbemObjectEx_Win32_Process.Create(strCommandLine1, Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strCommandLine1 & "]"
                        WScript.Quit 1
                End If
               
                With objSWbemObjectEx_Win32_ProcessStartup
                        .X = 650
                       
                        .Title = "Ping 2"
                        .FillAttribute = 91
                End With
               
                If objSWbemObjectEx_Win32_Process.Create(strCommandLine2, Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strCommandLine2 & "]"
                        WScript.Quit 2
                End If
        End With
End With

WScript.Quit 0


Сохраните код в файл с расширением .vbs и запустите.

Yoshimura 22-01-2016 21:52 2598269

Цитата:

Цитата Iska
Речь выше шла про пакетные файлы — я сделал для них.
А Вы попробуйте:
читать дальше »
Сохраните код в файл с расширением .vbs и запустите. »


Спасибо огромное! И мне помогло. Долго мучался искал как сделать чтоб проверка сети "красиво запускалась" в один клик. Ваш код просто супер. С небольшими твиками вот он ниже. Запускается три окна - пинг на роутер (есть подозрения что проблемы именно с ним), на EX.UA, и конечно же GOOGLE.COM. Сделал фон чуть более контрастным (черный с белым, красным и зеленым), а так же указал заголовки окон (тоже удобно знать кого пингует это окно. Окна, при разрешении моего ноута занимают весь экран - пинг роутера всю левую половину, пинг екса - верхнюю правую часть, пинг гугла - нижнюю правую.


Код:


Option Explicit

Const SW_NORMAL = 1

Dim objSWbemObjectEx_Win32_Process
Dim objSWbemObjectEx_Win32_ProcessStartup
Dim lngProcessID

Dim strCommandLine1
Dim strCommandLine2
Dim strCommandLine3

strCommandLine1 = "ping.exe -t 192.168.1.1"
strCommandLine2 = "ping.exe -t ex.ua"
strCommandLine3 = "ping.exe -t google.com"

With WScript.CreateObject("WbemScripting.SWbemLocator")
        With .ConnectServer(".", "root\cimv2")
                Set objSWbemObjectEx_Win32_Process        = .Get("Win32_Process")
                Set objSWbemObjectEx_Win32_ProcessStartup = .Get("Win32_ProcessStartup").SpawnInstance_
               
                With objSWbemObjectEx_Win32_ProcessStartup
                        .ShowWindow = SW_NORMAL
                        .CreateFlags = 16
                       
                        .X =  0
                        .Y = 0
                       
                        .XSize = 640
                        .YSize = 690
                       
                        .XCountChars = 40
                        .YCountChars = 3000
                       
                        .Title = "Ping ROUTER"
                        .FillAttribute = 2
                End With
               
                If objSWbemObjectEx_Win32_Process.Create(strCommandLine1, Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strCommandLine1 & "]"
                        WScript.Quit 1
                End If
               
                With objSWbemObjectEx_Win32_ProcessStartup
                        .X = 680

                        .XSize = 640
                        .YSize = 330
                       
                        .Title = "Ping EX.UA"
                        .FillAttribute = 4
                End With
               
                If objSWbemObjectEx_Win32_Process.Create(strCommandLine2, Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strCommandLine2 & "]"
                        WScript.Quit 2
                End If

                With objSWbemObjectEx_Win32_ProcessStartup
                        .X = 685
                        .Y = 365

                        .XSize = 640
                        .YSize = 330

                        .Title = "Ping GOOGLE.com"
                        .FillAttribute = 7
                End With
               
                If objSWbemObjectEx_Win32_Process.Create(strCommandLine3, Empty, objSWbemObjectEx_Win32_ProcessStartup, lngProcessID) <> 0 Then
                        WScript.Echo "Can't create process [" & strCommandLine2 & "]"
                        WScript.Quit 3
                End If
        End With
End With

WScript.Quit 0


Yoshimura 13-12-2017 00:47 2784017

Прошло почти два года. Теперь на Винде 10 и сервер 2016 этот скрипт частично развалился. Все параметры работают, кроме размера окна. Он теперь открывает три больших окна с нужными координатами. Вопрос - что не так со скриптом или виндой и как это исправить? Пробую менять параметры - на координаты и цвета реагирует, на размеры окон - никак. :(

Iska 13-12-2017 01:49 2784023

Yoshimura, скриншоты, Ваш код, и ждать, пока кто-нибудь с Windows 10 на борту проверит-подтвердит таковое поведение.

Yoshimura 13-12-2017 02:46 2784033

Вложений: 3
Уже все, нашел сам как исправить. Это как то связанно с нововведениями МелкоСофта в новой версии консоли встроенной в винду. Это можно отключить.
После запуска любого консольного приложения, нужно нажать правой кнопкой мыши на иконке консоли (самый левый верхний угол), в появившемся меню выбрать "Значения по умолчанию". Там во вкладке "настройки" выбрать внизу "Использовать прежнюю версию консоли". Возможно еще понадобиться зайти во вкладку "Расположение" и убрать галку в самом низу "автоматический выбор".
Данные действия возвращают поведение консоли "назад", к привычному по 7 винде.
Только нужно учитывать что это применяет настройки для всех консольных приложений.

Iska 13-12-2017 03:06 2784034

Цитата:

Цитата Yoshimura
Это как то связанно…»

Если сумеете ещё определить как именно, с чем конкретно связано — будет совсем хорошо.

Yoshimura 13-12-2017 03:10 2784036

Сложно сказать. Я довольно внимательно изучил код и конкретно функцию которая создает окна - именно с ней и была проблема. Все ее атрибуты работают и в новой версии консоли. Все кроме указания размера окна. С чем это связано я не знаю. На старой версии работает отлично как и было изначально. Разбираться в деталях дальше не вижу смысла и не имею желания - теперь работает как мне нужно и это хорошо.

Iska 13-12-2017 03:27 2784038

Yoshimura, Вы так и не показали, что происходит, на скриншотах. Посему, я имел в виду, чтобы Вы определили конкретную настройку/возможность в новой версии консоли, которая препятствует ранее корректной работе класса Win32_ProcessStartup. Возможно, дело в новых умолчаниях для буфера окна, возможно — в чём-то другом, мне глядеть-проверять не на чем.

Yoshimura 13-12-2017 03:53 2784039

Вложений: 2
Iska, Я чесс слово не могу понять что я делаю не так или что от меня требуется. Я никогда еще не объяснял так долго не проблему, а ее, уже найденное собой же решение...
Ок, давайте еще раз что было/стало.
Итак сначала. Ваш код (спасибо большое еще раз за него) несколькими сообщениями выше я несколько модифицировал под свои цели. Его же и выложил сразу за вашим последним сообщением (Ваше от 03-03-2013 08:33, мое от 22-01-2016 20:52). Все было мило и прекрасно пока я не обновился на Windows 10, и на некоторых машинах на Windows Server 2016. Там этот код не дает задать размер окон - они появляются с неким "стандартным" размером в не зависимости от того как я менял этот код. Проблема еще усугубляется тем что обычно я работаю на мониторах с не очень большим разрешением, либо вообще через TeamViewer. Может для 1080p или тем более 4K монитора это совсем не было бы проблемой. Для меня это проблема так как и без того места мало на экране. Скриншот в приложении.

Повторюсь я не знаю какие методы, обновления или умолчания в новой версии консоли. Я вообще не знаю что такое новая версия консоли. Я просто методом тыка пришел к тому что если поставить галку в настройках этой самой консоли "Использовать прежнюю версию консоли" то проблема исчезает. Все это уже было описано двумя сообщениями выше с конкретными скриншотами куда и что нужно нажимать. Я не знаю какие от этого меняются буфера, настройки внутри системы и т.д. Но я знаю что раньше была проблема, после нажатия этой галки эта проблема решилась.

Парой сообщений выше есть мой пост с инструкцией как эту проблему решить, если кому вдруг понадобиться. В этом посте в приложении скриншоты с "было" и "стало".

Этого достаточно?

Iska 13-12-2017 04:58 2784048

Yoshimura, никаких проблем, кроме одной: выяснить, в чём, собственно, кроется причина такого поведения. Не «в особенностях поведения новой консоли Windows 10.0», а в чём конкретно. Всё остальное было зараз понятно и малоинтересно. И понятно, что Вы сами в дебри WinAPI не лазаете. От Вас я хотел хотя бы скриншот, и Вы его выложили, спасибо Вам за это.

Возможно, как-то поможет совместно-параллельное задание не только пары X/YSize, но и X/YCountChars, не знаю… Повторю, что мне пробовать даже не на чем.

Цитата:

Цитата Yoshimura
Я вообще не знаю что такое новая версия консоли. »

https://www.google.ru/search?q=%D0%9...0%B8+Window+10

Цитата:

Цитата Yoshimura
Этого достаточно? »

Да, вполне. Что могли, Вы сделали.

Yoshimura 13-12-2017 13:16 2784108

Iska, Я пробовал играться абсолютно разными значениями обоих этих параметров. указывал их всех от маленьких (1-10) до очень больших (999999) и никакого результата на размер окна они не имели.
Повторюсь изменение цвета и положения окна работает исправно. Так же работает изменение параметров ShowWindow = ... Разные параметры влияют на открытие этого окна как положено - свернутое, на весь экран и т.д. Но вот задание размера увы никак. При чем что интересно скорее всего размер задан абсолютно - на ноутбуке (1366х768) и на мониторе 1024х768 окно имеет одинаковый размер в пикселах. Субъективно по относительным размерам окна к экрану. Линейкой не мерял, но на глаз явно видно.

icefalcon 16-05-2019 11:01 2871972

Извиняюсь на наглость, прошу добавить лог файл для каждого окна

Iska 16-05-2019 12:10 2871984

icefalcon, что Вы подразумеваете под логом? Каким должно быть его содержимое?

Serguei Kouzmine 17-05-2019 00:34 2872085

для изменения defaults на use legacy mode
Код:

' origin: https://www.tenforums.com/tutorials/94146-enable-disable-legacy-console-mode-all-consoles-windows-10-a.html#option2
' see also: https://stackoverflow.com/questions/8539821/how-to-get-reg-strvalue-from-hkcu-using-vbscript
Const HKEY_CURRENT_USER = &H80000001

strComputer = "."

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\default:StdRegProv")

strKeyPath = "Console"
strValueName = "ForceV2"
oReg.GetDwordValue HKEY_CURRENT_USER,strKeyPath,strValueName,strValue
Wscript.echo "ForceV2 = " & strValue

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
oReg.SetDwordValue HKEY_CURRENT_USER,strKeyPath,strValueName,0


Iska 17-05-2019 02:59 2872089

Serguei Kouzmine, зачем повторно пересоздавать oReg?!

Serguei Kouzmine 17-05-2019 16:23 2872140

@Iska наскоро сделано было

Код:

' origin: https://www.tenforums.com/tutorials/94146-enable-disable-legacy-console-mode-all-consoles-windows-10-a.html#option2
' see also: https://stackoverflow.com/questions/8539821/how-to-get-reg-strvalue-from-hkcu-using-vbscript
Option Explicit

Const bDebug = false

Const HKEY_CURRENT_USER = &H80000001

Dim strComputer: strComputer = "."

Dim myRegExp: Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "^10\..*"
       
Dim objWMIService: Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Dim objOperatingSystems: Set objOperatingSystems = objWMIService.ExecQuery ("select * from Win32_OperatingSystem")
Dim objOperatingSystem
For Each objOperatingSystem in objOperatingSystems
  if bDebug then
    Wscript.echo objOperatingSystem.Caption & " " & objOperatingSystem.Version, 0 + 32,"Window Version"
  end if
  if myRegExp.Test(objOperatingSystem.Version) then
    ' Enable Use Legacy Console in Windows 10
    if bDebug then
      Wscript.echo "Will need to Enable Use Legacy Console"
    end if

    Dim objStdRegProv: Set objStdRegProv = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

    Dim strKeyPath: strKeyPath = "Console"
    Dim strValueName: strValueName = "ForceV2"
    Dim strValue
    objStdRegProv.GetDwordValue HKEY_CURRENT_USER,strKeyPath,strValueName,strValue
    if strValue <> 0 then
      objStdRegProv.SetDwordValue HKEY_CURRENT_USER,strKeyPath,strValueName,0
          if bDebug then
        Wscript.echo "Enabled Use Legacy Console in Windows 10"
      end if
    else
          if bDebug then
        Wscript.echo "Use Legacy Console  is already Enabled"
      end If
    end if
  end if
Next



Время: 09:55.

Время: 09:55.
© OSzone.net 2001-