Войти

Показать полную графическую версию : запуск бат файла с указанием месторасположения окна


Страниц : [1] 2

Тимур_Макенов@vk
02-03-2013, 13:06
здравствуйте!
имеются 2 бат файла просто запускающие "ping" к указанному IP адресу. при запуске их поочередно одно окно накладывается на другое. приходиться ручками перемещать чтоб видеть оба окна параллельно. хотелось бы это автоматизировать. как это можно осуществить?

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

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

Тимур_Макенов@vk
02-03-2013, 19:47
создаешь ярлык на файл bat - ПКМ - свойства - расположение - положение окна
вводишь необходимое расположение....
также можно выбрать: шрифт, цвет и т.д. »

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

zion87
02-03-2013, 21:51
глобальное положение всех вызываемых окон командной строки »
с чего вы это взяли? Ярлык создается на каждый bat отдельно!!! И настройки в свойствах ярлыка индивидуальные!!!

Тимур_Макенов@vk
03-03-2013, 00:53
с чего вы это взяли? Ярлык создается на каждый bat отдельно!!! И настройки в свойствах ярлыка индивидуальные!!! »
потому что это первое что пришло в голову, и я это испробовал. запускаешь 1 бат файл, заходим в свойство выставляем нужные нам значения в окне расположение. запускаем 2 бат файл, и проделываем те же пункты но толь расположение меняем так, чтоб не накладывалось на 1. ок, сделали. закрываем оба окна. запускаем по новой и вуаля! сохранены настройки 2-го бат файла и окна друг на друге!

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

Тимур_Макенов@vk
03-03-2013, 02:27
Тимур_Макенов@vk, Вы что-то явно делаете не так. Сначала создаёте пакетные файлы. Затем создаёте на них ярлыки. Затем, не запуская пакетные файлы, настраиваете свойства созданных ярлыков, задавая разное расположение окон консоли. И только затем запускаете пакетные файлы через настроенные ярлыки. »
я вас понял, таким методом все получится, но есть один нюанс....
бат файлы я запускаю через специальные отведенные клавиши (клава такая мультимедийная). к сожалению при назначении клавише ярлыка к бат файлу (через ПО клавиатуры) такая фишка не действует))). если указать ярлык, то она его полностью игнорит, берет из ярлыка только ссылку к батнику и запускает его. по этому так важно указать в самом бат файле расположение окон

Iska
03-03-2013, 04:22
Тимур_Макенов@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
Тимур_Макенов@vk, таким методом все получится »
а я предлагал какой то другой?

Тимур_Макенов@vk
03-03-2013, 09:13
а я предлагал какой то другой? »
я вас сразу не понял, my bad))
но как я и сказал для меня этот способ не подходит...

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

Iska
03-03-2013, 09:33
да у меня в батнике только одна команда 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
Речь выше шла про пакетные файлы — я сделал для них.
А Вы попробуйте:
читать дальше »
Сохраните код в файл с расширением .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
Прошло почти два года. Теперь на Винде 10 и сервер 2016 этот скрипт частично развалился. Все параметры работают, кроме размера окна. Он теперь открывает три больших окна с нужными координатами. Вопрос - что не так со скриптом или виндой и как это исправить? Пробую менять параметры - на координаты и цвета реагирует, на размеры окон - никак. :(

Iska
13-12-2017, 01:49
Yoshimura, скриншоты, Ваш код, и ждать, пока кто-нибудь с Windows 10 на борту проверит-подтвердит таковое поведение.

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

Iska
13-12-2017, 03:06
Это как то связанно…»
Если сумеете ещё определить как именно, с чем конкретно связано — будет совсем хорошо.

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

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

Yoshimura
13-12-2017, 03:53
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
Yoshimura, никаких проблем, кроме одной: выяснить, в чём, собственно, кроется причина такого поведения. Не «в особенностях поведения новой консоли Windows 10.0», а в чём конкретно. Всё остальное было зараз понятно и малоинтересно. И понятно, что Вы сами в дебри WinAPI не лазаете. От Вас я хотел хотя бы скриншот, и Вы его выложили, спасибо Вам за это.

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

Я вообще не знаю что такое новая версия консоли. »
https://www.google.ru/search?q=%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5+%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82 %D0%B8+%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D0%B8+Window+10

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




© OSzone.net 2001-2012