Windows의 명령 프롬프트에서 자체 프로세스 pid를 얻는 방법 Windows에 “내장 된”명령을 찾고 있습니다. 편집 : 메신저

나는 명령 프롬프트에서 내 PID를 얻는 방법을 찾으려고 노력했다 . projects / getpids / index.html 하지만 Windows에 “내장 된”명령을 찾고 있습니다.

편집 : 메신저 “방탄 증명”방법을 찾고-내 프로세스에 대한 가정은 유일한 cmd.exe 또는 기타



답변

다른 솔루션은 방탄 및 내장되어 있지 않으므로 다음 솔루션을 제공한다고 생각했지만 결과를 어떻게 든 구문 분석 / 저장해야합니다.

title mycmd
tasklist /v /fo csv | findstr /i "mycmd"

답변

사용자가 WMIC에 액세스 할 수 있고 TEMP가 사용자에게 쓰기 권한이있는 유효한 경로를 가리키는 경우 다음 사항이 방탄이라고 생각합니다. 이것은 http://www.dostips.com/forum/viewtopic.php?f=3&t=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

스크립트는 현재 시간을 이름에 통합하는 임시 파일에 대한 독점 잠금을 설정합니다. 명명 된 배치 프로세스 2 개가 동일한 0.01 초 시간 간격 내에 PID를 가져 오려고 시도하는 경우 충돌이 발생할 수 있으며,이 경우 하나만 성공합니다.

실패한 프로세스는 반복적으로 루프백하고 성공할 때까지 새 잠금 파일 경로로 다시 시도합니다.

잠금 파일의 전체 경로는 WMIC 쿼리에서 사용할 수있는 고유 ID로 변환됩니다. WMIC는 FOR / F 명령 내에서 실행되므로 자식 cmd.exe 프로세스에서 실행됩니다. cmd.exe 프로세스의 ParentProcessID가 검색되는 이유입니다.


답변

Tony Roth의 답변을 확장 :

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"창 제목에 실제로 현재 명령이 포함되어 있기 때문에 와일드 카드가 필요합니다 (따라서 완전히 일치 시키려고하면 계속 진행됩니다).


답변

PowerShell + WMI 사용 :

powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId

답변

  1. Windows 작업 관리자에서보기-> 열 선택으로 이동하여 PID를 선택해야합니다.
  2. “tasklist / v”명령 프롬프트에서 자세한 작업 정보를 가져옵니다.
  3. live.sysinternals.com의 프로세스 탐색기 .

답변

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%

답변

트릭을 수행해야합니다.

작업 목록 / v