나는 명령 프롬프트에서 내 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
답변
- Windows 작업 관리자에서보기-> 열 선택으로 이동하여 PID를 선택해야합니다.
- “tasklist / v”명령 프롬프트에서 자세한 작업 정보를 가져옵니다.
- 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