Como extraer caracteres de la salida de un comando en el CMD

Tengo una duda especifica para poder realizar dos comandos a través del cmd, les explico mi problema :

Cuando tengo más de 2 celulares conectados a mi pc uso el comando de adb devices lo cual me arroja una salida de pantalla en el cmd de esta manera :

Lista de celulares en el equipo

545f2ff2d dispositivo

H15542hgh121d dispositivo

Y después tengo que poner el comando de

Adb -s +numero del celular (para poder enviarle información)

El problema esta es que no es muy practico copiar y pegar el numero de cada celular teniendo en cuenta que a veces son más de 20, otra cosa es que los números de los celulares varían, me refiero a que pueden tener letras y números y pueden cambiar su longitud.

Entonces lo que quiero hacer es guardar en variables los números de los celulares para después cuando les de el comando de

Adb -s (variable1)

Adb -s (variable2)

Y asi.

Ojala me explique, y cualquier ayuda es bienvenida.

2 respuestas

Respuesta
2

Se me paso comentar que tengo esta línea

@echo off
for /f "skip=1 tokens=1 delims== " %%a in ('adb devices') DO (echo adb -s %%a)
goto :fin
:Fin

Lo cual imprime en pantalla lo siguiente :

Adb -s 9f184d98 device
Adb -s 6HMFLJSG55MB8TC6 device

Ya solo faltaría que quite la palabra "device" así :

Adb -s 9f184d98
Adb -s 6HMFLJSG55MB8TC6

Respuesta
1

Hay varias formas de hacer esto. Una de ellas necesitaría, supongo, un ligero retoque en el FOR que indicas, pero necesitaría conocer exactamente la salida del comando "adb devices".

Si quieres conocer con un poco de detalle la sintaxis del comando FOR basta que teclees "FOR /?" en una ventana CMD.

Si las líneas de respuesta del comando fueran algo como lo que se intuye de tu mensaje, algo como:

545f2ff2d device

H15542hgh121d device

El FOR tal cual lo presentas debería funcionar porque le estás diciendo que use como delimitadores el "=" y el espacio y que se quede con la primera parte. Es decir que debería quedarse con "545f2ff2d" y "h15542hgh121d". El skip=1 forzaría que se ignorase la primera línea de la salida (si fuera "545f2ff2d device" esta primera no sería tratada por el FOR).

Ya me contarás.

Que tal

Te paso la salida exacta del comando 'adb devices'

https://mega.co.nz/#!QY5kxZra!JNSoJC5DItfKF5016K69-K9ty6s-sS0OpfTkXZs_WrI 

Nota :En la imagen solo tengo conectado un celular.

y con el comando del for que tengo

for /f "skip=1 tokens=1 delims== " %%a in ('adb devices') DO (echo adb -s %%a)

imprime en pantalla

adb -s 9f184d98 device

por lo que te comentaba que no le quita el texto 'device'

Saludos

Que tal, he logrado conseguir lo que necesito con el siguiente código, solo le quite el "delims"

@echo off

for /f "skip=1 tokens=1" %%a in ('adb devices') DO (

echo.
echo adb -s %%a comando1

echo adb -s %%a comando2

echo adb -s %%a comando3 

Echo.
)
goto :fin
:Fin

Con esto quedaría resuelto la pregunta principal, ahora solo te pido tu ayuda para depurar el código porque tengo el siguiente detalle que como puedes ver le quiero anexar más comandos para que se los mande a los celulares, pero primero le manda todos los comandos a un solo celular y cuando termina se los mando al segundo celular, ¿hay alguna manera de que por ejemplo el comando 1 se lo mande a todos los celulares a la vez y así sucesivamente?

Si piensas que este tema requiere que te abra otra pregunta, con gusto lo hago.

Saludos

Según te comento en la otra pregunta sobre el funcionamiento del DELIMS en el FOR aparentemente lo que has hecho al eliminar el DELIMS del FOR es usar los valores por defecto como separadores de campo, asignable a variable, que son espacio y tabulador en lugar de "=" y espacio que serían los forzados por "DELIMS== ".

Dado que en ambos casos el espacio sería un separador, y por tanto el primer campo de la respuesta se asignaria a %%a y el segundo a %%b, la única explicación que encuentro para que haya funcionado en el segundo caso y no en el primero es que en realidad lo que separa los campos sea un tabulador y no un espacio. Para confirmar esta sospecha podrías forzar que la respuesta al comando "adb devices" fuera a un archivo de texto (con "adb devices > salida.txt" por ejemplo) y me pasaras el archivo para contrastar el separador (el tabulador tiene el código ASCII 9 en lugar del 32 del espacio).

En cuanto a enviar primero el comando 1 a todos los celulares y luego el 2 y luego el 3, no le veo más solución que repetir el FOR tres veces y poner en el DO de cada uno de ellos los distintos comandos.

Ya me dirás.

Que tal, te paso la salida del comando adb devices confirmándote que efectivamente los separa un tabulador

https://mega.co.nz/#!kQpBTDCQ!LgyaVgbm1qZTpWWfdJ3eq_G5Dk7EjoDEBycKUUF9uLM 

Y para ejecutar el comando1 en todos los celulares, te comento que el numero que conecto a mi pc es random, una vez pueden ser 7 otras veces 3 y así,¿así que tendría que poner unos 10 for para que cubra un maxico de celulares conectados?

Me alegro de poder encontrar explicación razonable a las cosas. No siempre ocurre, incluso dando por hecho que tiene que existir, a veces no la encontramos y eso a mi me deja insatisfecho.

En cuanto a los comandos si te entendí bien el tipo de comandos a enviar a cada celular es fijo (comando 1, comando 2 y comando 3, o tal vez más comandos, pero un número fijo). Y lo que querías es que en lugar de enviar todos los comandos a un celular y luego todos los comandos al siguiente y luego todos al siguiente y así sucesivamente, se enviaran primero todos los comandos 1 a todos los celulares, luego todos los comandos 2 a todos ellos y finalmente todos los comandos 3 (o los que fueran, pero, como decía, un número fijo). Para esto habría que usar un FOR para cada comando, no un FOR para cada celular. En el DO de cada FOR se haría el ECHO que enviaría cada comando a todos los celulares.

Por tanto no depende del número de celulares presentes en el momento de la ejecución sino del número de comandos a enviar a cada celular.

Si no lo había entendido correctamente, acláramelo.

Lo entidiste perfectamente, entonces dejame darme la tarea de hacer el script y si tengo dudas te las haré saber

Aunque este tema ya está cerrado por contacto directo, me sigue saliendo que tengo pendiente de respuesta esta pregunta. La contesto para "cubrir el expediente" pero no insisto en que ya está aclarado y cerrado este tema. Por tanto, shaveax, no tienes que hacer nada por tu parte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas