Es imprescindible entender el código de forma correcta previamente a aplicarlo a tu trabajo y si tdeseas aportar algo puedes compartirlo con nosotros.
Solución 1:
Dado que ninguna de las otras soluciones es a prueba de balas y está integrada, pensé que ofrecería la siguiente solución, pero tenga en cuenta que deberá analizar/guardar los resultados de alguna manera:
title mycmd
tasklist /v /fo csv | findstr /i "mycmd"
Solución 2:
Ampliando la respuesta de Tony Roth:
title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do echo %f
El uso del filtro WINDOWTITLE evita la canalización, por lo que puede colocarlo en un bucle for y asignarlo a una variable con SET si lo desea:
title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f
La eliminación de la /v
lo hace más rápido, y el /NH
se deshace de la línea de encabezado. Necesitas el comodín después "uniqueTitle"
porque el título de la ventana en realidad contiene el comando actual (por lo tanto, continuaría si intentara hacer coincidir completamente).
Solución 3:
Usando PowerShell + WMI:
powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId
Uso de WMIC:
for /f %a in ('wmic os get LocalDateTime ^| findstr [0-9]') do set NOW=%a
wmic process where "Name='wmic.exe' and CreationDate > '%NOW%'" get ParentProcessId | findstr [0-9]
(como siempre, el doble de %
firma con for
en archivos por lotes)
Solución 4:
Creo que lo siguiente es infalible, siempre que el usuario tenga acceso a los puntos WMIC y TEMP a una ruta válida en la que el usuario tenga privilegios de escritura. Este es el resultado final de un trabajo colaborativo en 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
El script establece un bloqueo exclusivo en un archivo temporal que incorpora la hora actual en el nombre. Solo puede haber una colisión si dos procesos por lotes con nombres similares intentan obtener el PID dentro del mismo intervalo de tiempo de 0,01 segundos, en cuyo caso solo uno tendrá éxito.
Cualquier proceso que falle volverá repetidamente y volverá a intentarlo con una nueva ruta de archivo de bloqueo hasta que tenga éxito.
La ruta completa al archivo de bloqueo se transforma en un ID único que se puede usar en la consulta WMIC. WMIC se ejecuta dentro de un comando FOR /F, lo que significa que se ejecuta en un proceso cmd.exe secundario. Por eso se recupera el ParentProcessID del proceso cmd.exe.
Solución 5:
- Administrador de tareas de Windows, deberá ir a Ver -> Seleccionar columnas… y seleccionar PID.
- “lista de tareas /v” para obtener información detallada de la tarea en el símbolo del sistema.
- Explorador de procesos de live.sysinternals.com.