Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/28: Рейтинг темы: голосов - 28, средняя оценка - 4.71
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
1

PID исполняемого батника, активация окна батника

18.10.2013, 00:19. Просмотров 5465. Ответов 32
Метки нет (Все метки)

Много здесь чего перечитал, но точного ответа не нашел...

Собственно, как узнать PID "самого себя", т.е. исполняемого в текущий момент времени bat-файла (на худой конец - vbs-скрипта)? Чуть в более узком варианте - сделать окно исполняемого батника активным (перевести на передний план). Реально ли это реализовать без сторонних утилит?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2013, 00:19
Ответы с готовыми решениями:

Как узнать PID батника и записать его в файл?
Есть батник, который поднимает некую программу, если она выключилась. Нам нужно уметь остановить...

Создание батника
Добрый день! Помогите написать батник который добавлял бы ip адрес на компьютер(ну к примеру надо...

Создание батника
Помогите создать батник выполняющий действия: 1.1.Отключение режима отображения на экране...

Создание батника
Прошу помощи. 1.Нужно создать батник,который будет искать все файлы размер которых больше 0....

Вызов батника
Всем привет! У меня есть 2 бат-файла и я хочу с помощью первого вызвать второй в определенном...

32
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
18.10.2013, 00:50 2
Лучший ответ Сообщение было отмечено как решение

Решение

GetPID.cmd
Bash
1
2
3
4
5
6
7
@echo off
set T=%TEMP%\sthUnique.tmp
wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%
set /P A=<%T%
REM "%A%" is like "ParentProcessId=2008"
echo %A:~16%
pause
5
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
18.10.2013, 01:27  [ТС] 3
Спасибо большое. Главное, как оперативно!
Несколько вопросов:
1)
Цитата Сообщение от Charles Kludge Посмотреть сообщение
| find "ParentProcessId"
- этой фишкой убираем лишние строки?
2)
Цитата Сообщение от Charles Kludge Посмотреть сообщение
AND CommandLine LIKE "%%%TIME%%%"
- а вот это не просек. Не поясните? Без этого в wmic PID показывает...

П.С. Извините за тупость, если что.

Добавлено через 2 минуты
...А на передний план vbs-скриптом лучше всего, как я понимаю?
0
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
18.10.2013, 10:53 4
Лучший ответ Сообщение было отмечено как решение

Решение

Не знаю - мопед не мой, просто самому стало интересно. А насчёт переднего плана - надо дальше wmic ковырять, может и он умеет...

Добавлено через 4 часа 46 минут
Цитата Сообщение от Malysh-ok Посмотреть сообщение
сделать окно исполняемого батника активным (перевести на передний план)
Нашёл-таки:
rundll32 user32.dll, SetActiveWindow 1

Добавлено через 3 часа 10 минут
Ну и до кучи - сделать окно исполняемого батника неактивным:
rundll32 user32.dll, SetForegroundWindow 1
3
18.10.2013, 10:53
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
18.10.2013, 11:40  [ТС] 5
Цитата Сообщение от Malysh-ok Посмотреть сообщение
сделать окно исполняемого батника активным
Вот, что заметил. Если создать дочерний процесс методами bat, то его (процесса) окно выплевывает на передний план, если методами wmic - на задний.

Цитата Сообщение от Charles Kludge Посмотреть сообщение
AND CommandLine LIKE "%%%TIME%%%")
Видимо это как-то связано с более точной идентификацией нашего батника? В связи с чем еще, вот, вопрос: Если у нас запущено два идентичных батника (соотв. открыто 2 окна), то подобным способом мы можем и промахнуться? Т.е. получить не свой PID???
0
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
18.10.2013, 11:44 6
Ну дык попробуйте, заодно и нам расскажете.
0
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
18.10.2013, 11:55  [ТС] 7
Цитата Сообщение от Charles Kludge Посмотреть сообщение
rundll32 user32.dll, SetActiveWindow 1
Не работает: запускаю из батника блокнот, и его окно стабильно вылезает поверх батника
0
Charles Kludge
Клюг
7647 / 3162 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
18.10.2013, 11:57 8
Ну тогда не знаю, я гуёвые приблуды из батника не запускал.
0
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
18.10.2013, 11:58  [ТС] 9
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Ну дык попробуйте, заодно и нам расскажете
Этож сколько надо перезапустить этих батников, чтобы получить приемлемые статист. данные.
Думал, может точный ответ есть на этот вопрос...
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
18.10.2013, 12:46 10
Можно через стороннее средство nircmd

Bash
1
nircmd win activate process /1234
1234 - PID процесса.

Или через JScript:

Activate.JS
Javascript
1
2
var ShellApp = new ActiveXObject('Shell.Application');
WSHShell.AppActivate (WScript.Arguments(0));


Батником вызываем, как аргумент - передаем заголовок окна CMD.
Заголовок окна можно менять оператором Title:

Bash
1
2
3
4
5
6
7
8
9
@echo off
set name=MyApp
title %name%
 
:: Пауза 5 сек. - попробуйте тацнуть другое окно
ping -n 6 127.1
 
cscript.exe //nologo Activate.JS "%name%"
pause
0
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
18.10.2013, 14:10  [ТС] 11
Цитата Сообщение от Dragokas Посмотреть сообщение
Заголовок окна можно менять оператором Title:
К сожалению, мне менять заголовок нельзя

Dragokas, а не разъясните это:
Цитата Сообщение от Charles Kludge Посмотреть сообщение
AND CommandLine LIKE "%%%TIME%%%"
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
18.10.2013, 14:48 12
Malysh-ok, гм... кардинально. Но дописать к заголовку какую-то метку ведь можно?

Цитата Сообщение от Malysh-ok Посмотреть сообщение
AND CommandLine LIKE "%%%TIME%%%"
Command Line - это аргументы вызова WMIC вместе со всей командой.
В данном случае служит для идентификации WMIC самого себя на случай, если в момент выполнения кода запущен еще 1 или более процессов WMIC.

Введите в cmd.exe команду:

Bash
1
wmic process where name='wmic.exe' get /value
и сами все увидите.
1
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
19.10.2013, 01:49  [ТС] 13
Цитата Сообщение от Malysh-ok Посмотреть сообщение
Вот, что заметил. Если создать дочерний процесс методами bat, то его (процесса) окно выплевывает на передний план, если методами wmic - на задний.
ЕПРСТ! Так было в 7-ке, в ХР - выскакивает поверх батника...
Dragokas, я правильно мыслю: определяем PID своего батника, передаем его в JS (или VBS), и оттуда активизируем наш батник?
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
19.10.2013, 02:51 14
Malysh-ok, Мой пример с JS основан на передаче заголовка окна (или части имени заголовка от начала).
В WSH (JS, VBS) нет родных методов активации по Process ID.
0
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
19.10.2013, 03:07  [ТС] 15
А как же WshShell.AppActivate([ProcessID] | [Title]) в vbs???
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
19.10.2013, 03:14 16
Да уж, куриные мозги, помню что что-то было.
Смотрю в MSDN, а там только title написано: http://msdn.microsoft.com/en-us/library/wzcddbek%28v=vs.84%29.aspx

На самом деле PID тоже поддерживается, и тоже 1-м аргументом.
Метод определяет, что за параметр ему передают в зависимости от его типа. Число - PID. Строка, значит Title.
Вот такой он особенный метод.
0
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
19.10.2013, 12:42  [ТС] 17

Не по теме:

Немного не в тему...


Ситуация: Есть основной батник, он создает дочерний процесс (например, открывает тхт-файл в блокноте). В конце своей работы батник должен убить дочерний процесс по его PID.
Вопрос: Возможна ли такая ситуация: пользователь убил дочерний процесс (закрыл блокнот), система присвоила какому-то новому процессу такой же PID, как и у нашего дочернего, и когда наш батник заканчивает свою работу, он грохает "левый" процесс?
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
19.10.2013, 13:26 18
С 0,01 вероятностью может.
Можно проверить соответствие имени процесса его Process ID, если Вы заранее знаете и то, и другое:

Bash
1
2
3
4
5
6
7
8
@echo off
SetLocal EnableExtensions
set proc=имя процесса.exe
set PID=Номер Process ID
for /f "tokens=1,2 delims=," %%a in ('tasklist /nh /fo csv /fi "IMAGENAME eq %proc%"') do (
  if "%PID%"=="%%~b" echo Все нормально
)
pause
1
Malysh-ok
1 / 1 / 0
Регистрация: 17.10.2013
Сообщений: 57
23.10.2013, 02:12  [ТС] 19
Цитата Сообщение от Charles Kludge Посмотреть сообщение
wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%
А без использования файла никак? Что-то у меня с for не получается...
0
Dragokas
Эксперт WindowsАвтор FAQ
17065 / 7120 / 861
Регистрация: 25.12.2011
Сообщений: 10,931
Записей в блоге: 16
23.10.2013, 20:13 20
Какого файла?
0
23.10.2013, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2013, 20:13

Написать 2 батника
Есть такие 2 батника 1)echo off md c:\temp\Remark cd c:\temp\Remark echo Введите текст copy...

Удаленный запуск батника
Собственно с самим процессом разобрался. Делаю это через winrs. Проблема возникла при...

Запуск батника в домене
Добрый день коллеги!!! Есть рабочий батник по тихой установки Tight VNC(удаленное управление). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru