Grabacion de imagenes en batch
He decidido crear nuevo hilo para determinar si es problema del funcionamiento de la página al haber tantas entradas o si es otro motivo...
El bat principal lo he llamado "general.bat" y este es su contenido:
@echo off cd "C:\Users\Mario\Desktop\APRENDER BATCH\GRABACION CON BARRA" Setlocal EnableDelayedExpansion for %%u in (G, E, L, K, J, M, N) do ( set unidad=%%u dir /b !unidad!: 2>present!unidad!.txt for /f "eol=A tokens=5,*" %%i in (present!unidad!.txt) do ( if %%i==encontrar (echo no hay disco en !unidad! ) else START "" cldiw_c !unidad! "D:\Imagenes SD\ExclusivaTrebol" Pause ) )
Pues tengo insertadas las 3 primeras unidades, es decir la G, E y L, y cuando ejecuto el script general.bat (siempre con derechos de administrador) y he realizado varias pruebas para ver que es lo que sucede cuando se cierra la ventana (para ello he colocado un pause al final) y me sale lo siguiente:
Lo que pasa básicamente es que que el programa no lanza los script de grabación, tan solo me muestra el contenido de las imágenes que tengo insertadas y me dice las unidades que no están disponibles, es decir, me duestra el contenido de las unidades G, E y L y me dice que el resto no están disponibles, pero no sucede nada más.
He realizado algunos pruebas cambiando el else de lugar y cosas así sin demasiado sentido para ver si el problema esta ahí y lo único que he llegado a conseguir es la inversa de lo que necesito, me dice si quiero grabar justamente las imágenes que no tengo insertas, es decir, las unidades G, E y L se las salta y me pregunta si quiero grabar el resto de unidades existentes.. Como ese no era el camino restaure el script.
En cambio el script antiguo que usaba yo para grabar si me lanza las imágenes correctamente, quizás sea más fácil coger ese código y añadirle las barras que me has creado tu.
En cuanto al diseño de las barras si es justamente lo que quería, se ve perfectamente y además muestra el porcentaje con bastante acierto, quizás me vendría bien ocultar la ventana principal de la grabación que es muy grande y molesta a la hora de visualizar la ventana de las barras.
1 Respuesta
Para esta sí que me ha llegado la notificación. Como te dije he puesto una consulta en la página para ver si explican la razón, pero ya podemos trabajar con esta. Cuando me cuenten algo te lo digo.
El IF de los batch es muy puñetero y si no se respeta rigurosamente la sintaxis puede "salir por peteneras". De modo que pon el PAUSE como última instrucción del BAT, después del último ")" (tal como lo has puesto sería una instrucción más del DO, pero ni siquiera estoy muy seguro). Aunque tu comentario inicial me hacía pensar que sí que habías leído mi última respuesta de hoy, en el otro hilo, observo que no has sustituido el START del ELSE por un ECHO, como te sugería. Insisto en que lo haga porque intuyo que es el START el que está fallando. También podías probar a lanzar a pelo el START tal como figura, desde una ventana CMD, situado en la carpeta que utilizas, para alguna de las unidades montadas. Algo como:
START "" cldiw_c G "D:\Imagenes SD\ExclusivaTrebol"
Y no te "rajes" en el sentido de volver a lo que ya funciona. Esto tiene que funcionar y es más "elegante".
Lo de cerrar la ventana principal de grabación ya lo vemos luego, cuando esto funcione. Creo que hay una opción de START que no abre ventana, pero no la he usado nunca. Y habría que trasladar al BAT principal también la pregunta sobre si se quiere borrar la información.
Ahora también me llegan a mi las notificaciones, seguramente tengan alguna restricción a partir de 40 entradas para evitar que se saturen los hilos con muchos registros...
He hecho un descubrimiento de forma fortuita! Resulta que en una de las pruebas que he realizado con el script me han saltado el mensaje de si quiero grabar la unidad " " y me he quedado muy extrañado ya que momentos antes no me ha salido ese mensaje y el programa no tenia ningún cambio, y me he dado cuenta que si existía una diferencia y me he cerciorado haciendo pruebas y ya se por que no me funcionaba. Resulta que las imágenes que ya están grabadas o tienen algún contenido (por ejemplo un intento de grabación) el programita no me manda a la opción de grabarlas, simplemente me muestra la información, eso explicaría porque el programa se cerraba sin más.
Sin embargo si le inserto una SD en blanco (también me vale una formateada) si me salta el mensaje de: ¿Quiere grabar la unidad "? Parece ser que el script no contempla la opción de que las SD lleven información o que con el "else" el programa se hace la pincha un lio.
Lo que me extraña que me haya dado cuenta de ese detalle ya que me podría haber vuelto loco.. esto explica porque te funciona a ti y a mi no me funcionaba.
Por lo demás parece que bien, se inicia la grabación y me muestra la barra de progreso, además me avisa de las unidades que no tengo disponibles.
Por cierto he probado lo del echo start pero no solucionaba el problema, y en lo del pause tenias razón, ahora veo de golpe todas las unidades que tengo no disponibles.
El echo start no pretendía solucionar el problema sino solo saber que se intentaba hacer con las unidades que el script daba por "montadas", ver que comando se intentaba ejecutar en ese caso.
Tal como está el GENERAL.BAT solo hay dos posibilidades, que se cumpla la condición del IF (que debe sacar el mensaje "no hay disco en unidad X:" o que no se cumpla, en cuyo caso debería lanzar el START. Pero puede ocurrir que el START se lance con unos parámetros incorrectos y eso es lo que nos permitiría ver el ECHO START...
Y hablando de eso, un problema del script es que la forma de determinar que una unidad está montada, tal como lo he programado, es que el comando
dir /b x: 2>presentx.txt
que utilizo para ver si la unidad x: está montada asume que si no lo está el mensaje que produce el comando anterior (y que se graba en el archivo presentx.txt) sea "El sistema no puede encontrar la ruta especificada.", por ello compruebo si la quinta palabra es "encontrar" y si no lo es asumo que está montada. Lógicamente esto puede ser mucho suponer y no estaría de más encontrar una fórmula más rigurosa. Revisa en cada caso que resultados da ese comando, a ver si encontramos una fórmula más ajustada. Puedes hacerlo echándole un vistazo a los diferentes archivos present*.txt que se generan. O también, si se te ocurre, se podría usar otra forma de hacer esto mismo. Prueba con las diferentes situaciones en que pueda estar una SD para ver en cuáles se debería intentar grabar y en cuáles no. Si encontramos un criterio válido podemos intentar utilizarlo.
Acabo de ver una posible solución más elegante (y sin usar archivos auxiliares tipo PRESENTx.TXT). Sería el comando IF EXIST x:\NUL.
Lo probaré y te cuento algo.
Según las pruebas que he realizado para ver los distintos mensajes que genera el archivo present.txt existen estas posibilidades:
1- Cuando la SD no se encuentra disponible ---> present.txt = "El sistema no puede encontrar la ruta especificada."
2- Cuando la SD esta disponible y tiene datos dentro ---> present.txt = (aparece en blanco el txt)
3- Cuando la SD esta disponible y esta en blanco(formateada) ---> present.txt = "No se encuentra el archivo"
Sin entender demasiado del tema, deduzco que cuando el programa determina que la unidad no esta disponible y se dispone a realizar la grabación, este proceso queda descartado al no tener ningún contenido el archivo present txt, por lo que nunca se cumplirá la condición para que comience a grabar. En cambio como en el otro caso en el que la SD esta en blanco si se genera un contenido en el present.txt si que sirve esto como condición y por eso se inicia el proceso de grabación. No se si con esta conclusión estoy equivocado, pero creo que se puede intentar dar un valor en el present.txt en el caso de que la SD contenga datos, no se como se pondría esa condición, pero seria algo así como:
Si la unidad POR contiene "algún dato" escribe un present.txt con el siguiente texto "..."
Y supongo que con eso ya podrás colocar una sentencia más que diga que tanto si la SD tiene datos como si no que se grabe igualmente siempre y cuando este disponible (es decir que no se encuentre el "hallar" en el present)
Es todo lo que se me ocurre.
Un saludo!
Tienes toda la razón. Cuando la unidad tiene algún contenido el comando no da ningún mensaje por la salida 2 (la de error e información complementaria) con lo que el PRESENTx.TXT no contiene nada y eso hace que no se ejecute el FOR para esa unidad. Me he estado dando cabezazos contra eso y contra el hecho de que no se permita (o no lo haya conseguido) meter una etiqueta en un bucle FOR. Al final he optado por incluir una variable interna de tratamiento para controlar si la unidad ha sido tratada por el FOR o no. Si no ha sido tratada por el FOR es que es grabable. Mira a ver si esto resuelve tus/nuestros problemas:
@echo off cd "C:\Users\Mario\Desktop\APRENDER BATCH\GRABACION CON BARRA" Setlocal EnableDelayedExpansion for %%u in (G, E, L, K, J, M, N) do ( set unidad=%%u set trat=n dir /b !unidad!: 2>present!unidad!.txt for /f "eol=A tokens=5,*" %%i in (present!unidad!.txt) do (if %%i==encontrar (echo no hay disco en !unidad!:&set trat=s) if !trat!==n START "" cldiw_c !unidad! "D:\Imagenes SD\ExclusivaTrebol" ) ) Pause
Si ya va bien podemos empezar a probar a eliminar la ventana intermedia (ya he hecho alguna prueba prometedora)
Me ocurre exactamente el mismo problema con ese código, solo se inician las grabaciones de las SD que no contienen información. He mirado los present que me generan las imágenes que contienen datos y están en blanco.
Saludos.
Si está bien trasladado observarás que ahora las unidades que generan PRESENT de longitud cero deben forzar que la variable TRAT valga "n" precisamente por no entrar a la parte del FOR /F que la pone a "s" si saca el mensaje "no hay disco en la unidad X:". De modo que algo no debe estar como se supone. Por favor, pon un ECHO delante del START, ejecuta el BAT y muéstrame la ventana completa a ver si veo algo. Tampoco estaría de más que copiaras el contenido del PRINCIPAL.BAT o que le hagas un TYPE PRINCIPAL.BAT desde una ventana CMD. Si te supone algún problema dímelo.
Perdona, antes de hacerlo sustituye la línea:
dir /b ! Unidad!: 2>Present! Unidad!.txt
por:
dir /b ! Unidad!:>Nul 2>present! Unidad!.txt
añadiendo el ">nul" para que las unidades que contienen información no "emborronen" la ventana.
Hacía tiempo que el p. editor de la página no hacía de las suyas. No debe haber espacio entre "!" y "unidad" y esta palabra no debería empezar por mayúscula en ninguna de las cuatro ocasiones. Ni tampoco "Nul" aunque el tema de las mayúsculas no debe afectar al funcionamiento, pero sí la separación del carácter "!".
Perdón, creo que sobran algunos paréntesis. Prueba con esto:
@echo off cd "C:\Users\Mario\Desktop\APRENDER BATCH\GRABACION CON BARRA" Setlocal EnableDelayedExpansion for %%u in (G, E, L, K, J, M, N) do ( set unidad=%%u set trat=n dir /b !unidad!:>nul 2>present!unidad!.txt for /f "eol=A tokens=5,*" %%i in (present!unidad!.txt) do (if %%i==encontrar echo no hay disco en !unidad!:&set trat=s) if !trat!==n START "" cldiw_c !unidad! "D:\Imagenes SD\ExclusivaTrebol" ) Pause
Ahora ya es cuestión de depurar la intentar y tamaño de las ventanas, se hace muy caótico grabar 4 SD porque te salen 8 ventanas superpuestas y no queda claro a simple vista a que unidad pertenece las barras de progreso.
Te expongo algunas ideas que no se si serán posibles de realizar, pero seguro que de una u otra forma se podrá cambiar algo.
1-Las ventanas que te preguntan si quieres grabar la unidad " .." son demasiado grandes, por lo menos hacerlas menos anchas.
2- Las ventanas de las barras de progreso si que me parece acertado el tamaño, lo único que no se si se puede de poner de forma más clara a que unidad corresponde cada barra.
3-Seria interesante ocultar las ventanas de grabación al aceptar, el problema que no se mostraría mensaje de si ha fallado la grabación o si ha sido correcta, una solución seria mostrar una ventana emergente con el comando msg.
De momento es eso lo que se me ocurre así de primeras.
Un saludo!
Por cierto, estoy aprendiendo un poco como hacer menús en batch y como ejecutar diferentes opciones desde ese menu, mi idea es hacer que este programa sea muy sencillo de usar y que te ponga en bandeja una serie de opciones relacionadas con la grabación, carga y copia de imágenes.
Básicamente el programita que has realizado estaría en una de las opciones de ese menu, y habrían otras opciones como por ejemplo: formatear con el comando diskpart que es muy completo, o realizar copias de una determinada imagen para posteriormente grabarlas con el programa que hemos estado depurando.
De esta manera podemos aprender bastante aspectos sobre el tema y a la vez realizamos algo muy útil que no consigue ningún programa que yo haya visto.
Si quieres creare otro hilo con el titulo relacionado con lo que estemos haciendo en el programa y ahí iré subiendo los progresos que he ido haciéndole al menu del programa, de esta manera también evitaremos que esto pete después de tantas entradas...
Un saludo y muchas gracias por todo, solo no hubiera podido llegar tan lejos.
Muy bien. Mañana vemos por dónde tiramos. A mí me da un poco igual que sea con pregunta nueva o no, pero tal vez si el título es adecuado pueda servir a más gente de la que busca cosas en la red.
A ver si esto se adapta mejor a tus ideas. He trasladado a la ventana principal todo el control de los discos, incluido el mensaje de pérdida de datos, la ventana de grabación no se muestra y en la de control de grabación he incluido una línea que permita saber que unidad se está grabando.
Ahora PRINCIPAL.BAT sería:
@echo off Setlocal EnableDelayedExpansion cd "C:\Users\Mario\Desktop\APRENDER BATCH\GRABACION CON BARRA" for %%u in (G, E, L, K, J, M, N) do ( set unidad=%%u set trat=n dir /b !unidad!:>nul 2>present!unidad!.txt for /f "eol=A tokens=5,*" %%i in (present!unidad!.txt) do (if %%i==encontrar echo no hay disco en !unidad!:&set trat=s) if !trat!== n call :grabar ) pause goto :eof :grabar set /p Es_grabar=Se va a borrar todo el contenido de la unidad !unidad!: ¨Seguro (S/N)? if not %Es_grabar%==S if not %Es_grabar%==s goto :eof echo Va a comenzar la grabacion en !unidad!: %date% %time% start /b "" cldiw_c !unidad! "D:\Imagenes SD\ExclusivaTrebol" goto :eof
El nuevo CLDIW_C.BAT sería:
@echo off title=cldiw_%1 if #%1#==## goto :sinDisco if not exist %2 goto :sinImagen start "Control grabacion unidad %1" GrabCont %1 c:\utilidades\CommandLineDiskImager\CommandLineDiskImager %2 %1 > Grab%1.log if errorlevel 1 echo Ha habido error en la grabacion en %1: %date% %time%&goto :fin if errorlevel 0 echo Ha terminado la grabacion en %1: %date% %time% goto :fin :sinDisco echo No se ha indicado unidad&goto :salir :sinImagen echo No existe el archivo imagen %2 :fin for /f "tokens=2,3* delims= " %%a in ('tasklist /NH /FO TABLE /FI "WINDOWTITLE eq Administrador: =GrabCont%1"') do ( taskkill /PID %%a > nul ) :Salir exit
Como siempre tendrás que ajustar el path del CLDI (CommandLineDiskImager) al que tengas en tu entorno.
Por último al GRABCONT.BAT solo habría que insertarle la línea "echo Control Grabacion unidad %1:" después del comando CLS (más o menos la undécima desde abajo).
Pues eso. Pruebas y me dices.
Espectacular! Me gusta como queda, y se ve todo claro.
Una pregunta, creo que leí que desde el command line se podía usar para grabar imágenes pero no para copiar una imagen de un SD, ¿puedes confírmamelo? Creo que todavía esa version no la soportaba.
Es que una de las tareas que hago habitualmente es clonar una SD que tenga insertada en una unidad para ya luego grabarla con el método del script que me has hecho.
Gracias y un saludo
Efectivamente, según dice en https://github.com/davidferguson/CommandLineDiskImager "Currently only writing an image file to a device is supported, you can't read a device to a file just yet." Si no entiendo mal solo se puede escribir/grabar un archivo de imagen a un dispositivo, todavía no se puede leer un dispositivo a un archivo (de imagen, supongo).
Por lo que he visto desde el 4/5 de octubre no ha habido muchas "mejoras" en el producto por lo que intuyo que no es algo muy vivo. Me temo que tendrás que usar la otra herramienta, en modo Windows, para crear la imagen.
Entonces, ¿cómo está ahora ya te vale? Si se te ocurre alguna otra cosa no dudes en comentarlo.
Respecto al menú del que hablabas también podemos empezar a verlo, si quieres.
Entonces usare la otra alternativa de clonar con el programa Win32DiskImager, pero intentaré integrarlo todo desde el menu del batch, pues nada este hilo lo doy por finalizado ya que hace exactamente lo que necesito, voy a crear otro hilo sobre la creación de menús y alternativas a la copia de imágenes para que sea fácil de encontrar por otros usuarios la ayuda.
Un saludo y ahora te comento.
- Compartir respuesta