Тема: CMD/BAT: Определение Process ID текущего cmd.exe
Среди многообразия командных процессоров cmd.exe особо выделяется бедностью и скупостью программных средств. Самоидентификация, или предоставление информации о себе - одно из них. В данном случае речь идет о PID или ProcessID, идентификаторе процесса. cmd.exe не может дать свой PID.
И так! Пафосное вступление закончилось. А теперь суть.
Зачем может понадобиться PID? Это уникальное число в данный момент времени.
-- С помощью PID просто сослаться именно на свой процесс (утилита tasklist ненадежна - достаточно запустить две копии cmd.exe и вы уже не знаете кто из них кто).
-- Может быть удобно при создании временных файлов, каталогов (использование переменной %RANDOM% в качестве части имени файла приводит к конфликтам - CMD/BAT: Проблема создания уникальных значений в конвейерных командах)
Предлагаю небольшой скриптик cmdpid.bat, который помогает идентифицировать PID текущей (!!!) копии cmd.exe. Найденное значение записывается в переменную окружения CMDPID. Функционал реализован на powershell. Суть скрипта в 4 строках после метки :cmdpid, которые можно смело скопировать в свой скрипт; все остальные - суть обвязка для удобства использования в качестве самостоятельной утилиты.
@echo off
if "%~1" == "/?" goto :help
if "%~1" == "-?" goto :help
if /i "%~1" == "/h" goto :help
if /i "%~1" == "-h" goto :help
for %%p in ( powershell.exe ) do if "%%~$PATH:p" == "" (
>&2 echo:%%p required.
exit /b 1
)
:cmdpid
for /f "tokens=*" %%p in ( '
set "PPID=(Get-WmiObject Win32_Process -Filter ProcessId=$P).ParentProcessId" ^& ^
call powershell -NoLogo -NoProfile -Command "$P = $pid; $P = %%PPID%%; %%PPID%%"
' ) do set CMDPID=%%p
goto :EOF
:help
echo:Calculates the Process ID of the Command Prompt
echo:and assigns it to the CMDPID variable.
echo:
echo:Usage: %~n0