как получить собственный процесс pid из командной строки в окнах

im, пытаясь найти способ получить мой собственный PID из командной строки (для последующего использования в командах bat) до сих пор единственным полезным способом, который я нашел, было использование getpids.exe отсюда: http: //www.scheibli.com/projects/getpids/index.html , но im ищет команду, которая «встроена» в окна

edit: im ищет «пуленепробиваемый» способ - никаких предположений о том, что мой процесс является единственным cmd.exe или чем-либо

20 голосов | спросил radai 26 MaramFri, 26 Mar 2010 08:32:11 +03002010-03-26T08:32:11+03:0008 2010, 08:32:11

11 ответов


30

Поскольку ни одно из вышеперечисленных решений не является пуленепробиваемым и встроенным, я решил, что добавлю свою маленькую рутину, которая будет ближе к доказательству пули, но вам нужно будет как-то разобрать /сохранить результаты

сделайте это, если вы можете в пакетном файле

title=mycmd
tasklist /v /fo csv | findstr /i "mycmd"
ответил tony roth 26 MarpmFri, 26 Mar 2010 18:12:39 +03002010-03-26T18:12:39+03:0006 2010, 18:12:39
6

Я считаю, что следующее является пуленепробиваемым, если у пользователя есть доступ к точкам WMIC и TEMP к допустимому пути, где у пользователя есть права на запись. Это конечный результат совместной работы на http: //www .dostips.com /форум /viewtopic.php е = 3 & амп;?. т = 6133

@echo off

:getPID  [RtnVar]
::
:: Store the Process ID (PID) of the currently running script in environment variable RtnVar.
:: If called without any argument, then simply write the PID to stdout.
::
setlocal disableDelayedExpansion
:getLock
set "lock=%temp%\%~nx0.%time::=.%.lock"
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
2>nul ( 9>"%lock%" (
  for /f "skip=1" %%A in (
    'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
  ) do for %%B in (%%A) do set "PID=%%B"
  (call )
))||goto :getLock
del "%lock%" 2>nul
endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%"
exit /b

Сценарий устанавливает исключительную блокировку временного файла, который включает текущее время в имя. Может произойти только столкновение, если два, например, именованные пакетные процессы, попытаются получить PID в течение одного и того же интервала времени 0,01 секунды, и в этом случае только один будет успешным.

Любой неудавшийся процесс будет повторять цикл и повторить попытку с новым пути файла блокировки до тех пор, пока он не удастся выполнить.

Полный путь к файлу блокировки преобразуется в уникальный идентификатор, который можно использовать в запросе WMIC. WMIC запускается в команде FOR /F, что означает, что он запущен в дочернем процессе cmd.exe. Вот почему восстанавливается ParentProcessID процесса cmd.exe.

ответил dbenham 21 SunEurope/Moscow2014-12-21T15:53:30+03:00Europe/Moscow12bEurope/MoscowSun, 21 Dec 2014 15:53:30 +0300 2014, 15:53:30
5

, если вы знаете, что работает только один cmd.exe, вы можете получить PID таким образом:

for /F "tokens=1,2" %%i in ('tasklist /FI "IMAGENAME eq cmd.exe" /fo table /nh') do set pid=%%j

echo %pid%
ответил zumalifeguard 21 J0000006Europe/Moscow 2016, 09:07:28
4

Это должно сделать трюк:

  

список задач /v

ответил WooYek 26 MaramFri, 26 Mar 2010 11:16:31 +03002010-03-26T11:16:31+03:0011 2010, 11:16:31
4
  1. Диспетчер задач Windows, вам нужно будет перейти в View -> Выберите «Столбцы» и выберите «PID».
  2. "tasklist /v", чтобы получить подробные сведения о задаче в командной строке.
  3. Обработчик процессов из live.sysinternals.com .
ответил Vivek Kumbhar 26 MaramFri, 26 Mar 2010 11:39:45 +03002010-03-26T11:39:45+03:0011 2010, 11:39:45
3

Если вы хотите найти PID imagename «notepad.exe», то для вас будет работать следующий код:

for /F "tokens=1,2" %i in ('tasklist') do (
 if "%i" equ "notepad.exe" (set x=%j)
)
echo %x%
ответил Minchurl 17 J0000006Europe/Moscow 2014, 12:53:12
3

Расширение ответа Тони Рот:

title=uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do echo %f

Использование фильтра WINDOWTITLE позволяет избежать использования канала, поэтому вы можете поместить его в цикл for и назначить ему переменную с SET, если хотите:

title=uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f

Удаление /v ускоряет работу и /NH избавляется от строки заголовка. Вам нужно подстановочный знак после «uniqueTitle», потому что заголовок окна фактически содержит текущую команду (таким образом, она будет продолжать и продолжать, если вы попытаетесь полностью ее сопоставить).

ответил David 7 WedEurope/Moscow2016-12-07T16:07:59+03:00Europe/Moscow12bEurope/MoscowWed, 07 Dec 2016 16:07:59 +0300 2016, 16:07:59
2

Если у вас есть комплект Windows 2003 Resource, то нажмите его через qgrep, чтобы получить нужную строку. Затем вы можете извлечь pid отсюда (это предполагает, что у вас есть только один CMD за один раз),

tasklist /v | qgrep cmd

cmd.exe 2040 RDP-Tcp#447 0 1,804 K Running MACHINE\Administrator  0:00:00 Command Prompt
ответил Guppy 26 MaramFri, 26 Mar 2010 11:47:00 +03002010-03-26T11:47:00+03:0011 2010, 11:47:00
1

Взгляните на это небольшой пакетный трюк . Он задает название cmd для специального значения, а затем использует список задач для его поиска. Изобретательский

\\ Greg

ответил uSlackr 26 MarpmFri, 26 Mar 2010 17:10:14 +03002010-03-26T17:10:14+03:0005 2010, 17:10:14
1

Использование PowerShell + WMI:

powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId
ответил Nico57 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 20 Sep 2017 03:02:46 +0300 2017, 03:02:46
0

ЭТО КРАТКИЙ СПОСОБ ПОЛУЧИТЬ ИСПЫТАНИЕ ПРОЦЕССА ДЛЯ ОТКРЫТОЙ CMD

tasklist /v /fi "imagename EQ cmd.exe" /FO LIST | FIND "PID:"
ответил Nico57 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 20 Sep 2017 03:02:46 +0300 2017, 03:02:46

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132