Weno, este es un BATCH de SirDarkCat de hace un tiempo para extraer el PID de los procesos:
@echo off
FOR /F "tokens=1,2" %%i IN ('tasklist') DO (
IF "%%i"=="cmd.exe.exe" (
SET pid1=%%j
)
IF "%%i"=="wmplayer.exe" (
SET pid2=%%j
)
IF "%%i"=="MessengerDiscovery Live.exe" (
SET pid3=%%j
)
)
echo %pid1%
echo %pid2%
echo %pid3%
Pues tiene un problema k necesito solucionar...funciona siempre bien, excepto en el caso de k el .exe tenga un espacio en el nombre...
Por ejemplo en el ejemplo k puse arrivano se extraera bien el %pid3% de "MessengerDiscovery Live.exe"
El problema viene en que la variable %%i es la linea de caracteres asta k encuentrta un espacio, la variabl %%f es la siguiente, por eso cuando el proceso tiene un espacio en el medio coje como el PID "Live.exe" en este caso, ya k %%f será "Live.exe"
La salida de tasklist es así:
Nombre de imagen PID Nombre de sesión Núm. de Uso de memor
========================= ====== ================ ======== ============
System Idle Process 0 Console 0 16 KB
System 4 Console 0 220 KB
smss.exe 904 Console 0 392 KB
csrss.exe 972 Console 0 10.608 KB
winlogon.exe 996 Console 0 1.620 KB
services.exe 1040 Console 0 7.268 KB
lsass.exe 1052 Console 0 1.480 KB
svchost.exe 1216 Console 0 6.904 KB
svchost.exe 1272 Console 0 6.744 KB
svchost.exe 1396 Console 0 25.504 KB
svchost.exe 1612 Console 0 5.572 KB
svchost.exe 1716 Console 0 6.612 KB
spoolsv.exe 1812 Console 0 7.740 KB
svchost.exe 504 Console 0 4.976 KB
nod32krn.exe 572 Console 0 22.048 KB
nvsvc32.exe 620 Console 0 3.952 KB
svchost.exe 656 Console 0 6.676 KB
wdfmgr.exe 708 Console 0 1.780 KB
alg.exe 1892 Console 0 5.912 KB
explorer.exe 792 Console 0 52.800 KB
nod32kui.exe 1672 Console 0 2.260 KB
TBPANEL.exe 1692 Console 0 5.460 KB
ctfmon.exe 1584 Console 0 5.836 KB
MessengerDiscovery Live.e 324 Console 0 9.028 KB
usnsvc.exe 3636 Console 0 2.596 KB
LVCOMSX.EXE 3220 Console 0 4.616 KB
firefox.exe 2464 Console 0 111.456 KB
HelpCtr.exe 3020 Console 0 2.992 KB
HelpSvc.exe 3984 Console 0 13.948 KB
HelpHost.exe 2936 Console 0 10.792 KB
cmd.exe 3096 Console 0 4.400 KB
cmd.exe 1596 Console 0 1.628 KB
wmplayer.exe 2836 Console 0 6.128 KB
cmd.exe 3256 Console 0 4.396 KB
tasklist.exe 2480 Console 0 6.620 KB
wmiprvse.exe 1360 Console 0 7.896 KB
Pues por ejemplo de wmplayer.exe cojerá como PID 2836 por lo k funcionará...pero el de MessengerDiscovery Live.e Solo cojerá MessengerDiscovery como ejecutable en %%i y como PID Live.e que es %%f
Aún por encima de eso me acabo de dar cuenta de otra cosa, si el ejecutable tiene el nombre muy largo no lo cojerá correctamente...supongo k esto se puede aumentar aumentando el bufer de ancho de la consola...tengo k provar...
Weno, el tema k mas me interesa es el del problema k se causa cuando el ejecutable tiene un espacio (o mas) por medio...y weno lo de k si el ejecutable es largo se acorta tambien me imprta...
¿Como areglariais eso?
Saludos ;) ;)
:P que interesante xD
se me ocurren muchas soluciones.. muy muy largas xD
implementar un split por tamaño es una de ellas.. es decir que tome los primeros 25 caracteres, y despues el que sigue, y asi.. pero creo que lo mejor seria.. trabajar hacia atras..
esto consistiria en 2 pasos..
primero hacer un programa que imprima todo alrevez jaja
y despues uno que con ese output alreves, haga lo mismo que mi primer programa..
aunque talves sea mejor usar debug..
en todo caso, una solucion rapida, seria..
@echo off
FOR /F "tokens=1,2,3" %%i IN ('tasklist') DO (
IF "%%i"=="cmd.exe.exe" (
SET pid1=%%j
)
IF "%%i"=="wmplayer.exe" (
SET pid2=%%j
)
IF "%%i"=="MessengerDiscovery" (
SET pid3=%%k
)
)
echo %pid1%
echo %pid2%
echo %pid3%
Weno, eso serviría si conoces que aplicacion tiene espacio...pero es k mira...realmente yo lo k quiero hacer es guardar en varias variables el nombre de los procesos en ejecución...y en otra variable el PID de la variable.
Mi idea es ejecutar un tasklist /NH que tendrá esta salida:
System Idle Process 0 Console 0 16 KB
System 4 Console 0 220 KB
smss.exe 904 Console 0 392 KB
csrss.exe 972 Console 0 6.412 KB
winlogon.exe 996 Console 0 1.080 KB
services.exe 1040 Console 0 7.320 KB
lsass.exe 1052 Console 0 2.808 KB
svchost.exe 1212 Console 0 6.904 KB
svchost.exe 1264 Console 0 6.920 KB
svchost.exe 1388 Console 0 22.568 KB
svchost.exe 1572 Console 0 5.784 KB
svchost.exe 1652 Console 0 6.604 KB
spoolsv.exe 1792 Console 0 9.172 KB
svchost.exe 732 Console 0 5.000 KB
nod32krn.exe 780 Console 0 22.200 KB
explorer.exe 812 Console 0 12.920 KB
nvsvc32.exe 804 Console 0 3.812 KB
svchost.exe 940 Console 0 6.864 KB
wdfmgr.exe 544 Console 0 1.800 KB
nod32kui.exe 1972 Console 0 1.264 KB
TBPANEL.exe 228 Console 0 896 KB
ctfmon.exe 352 Console 0 1.904 KB
wmplayer.exe 360 Console 0 5.312 KB
alg.exe 2440 Console 0 6.024 KB
usnsvc.exe 2876 Console 0 2.704 KB
Virtual PC.exe 2320 Console 0 5.668 KB
msnmsgr.exe 1512 Console 0 22.292 KB
MessengerDiscovery Live.e 4044 Console 0 4.900 KB
firefox.exe 2956 Console 0 67.508 KB
wmiprvse.exe 3100 Console 0 8.104 KB
cmd.exe 2128 Console 0 4.408 KB
tasklist.exe 2132 Console 0 6.628 KB
Pues yo lo que quiero es almacenar en una variable pro1 el valor de uno de los procesos y en una variable pid1 el PID de este proceso.
Despues serían las variables pro2 y pid2 para el siguiente proceso...
Y así sucesivamente asta reunir todos los procesos con su PID...
El problema es sobre todo el tema de los espacios, tu aki no sabes en k kaso el ejecutable tiene espacio...despues el problema de que se acorten los procesos con nombre muy largos weno, supongo k no tendrá solución...
¿Como sería entonces para lo k yo quiero?
fuera de lo que te dije de hacer un programa que invierta una linea, creo que no se puede.
en debug se puede hacer.. con la interrupcion 21 y las funciones a y 9h
Saludos!!