Grabación simultanea de diferentes imágenes

He estado todo este tiempo usando perfectamente el programa que elaboraste para la grabación de múltiples SD, y me ha surgido una idea de mejora que me ahorraría mucho trabajo a la hora de configurar las SD.

Hasta ahora lo que he estado haciendo es crear clones de una imagen SD, pero una vez que las grabo tengo que conectarme mediante SSH al shell de linux para poder configurar cada una de las SD poniéndole una determinada configuración, y esto repetido muchas veces pues como supondrás supone mucho tiempo.

Así que se me ha ocurrido una idea y es conectar 15 SD de golpe en red para cargarle patrones de configuración mediante un programa de envió de archivos llamado WinScp, no se si lo conocerás, pero básicamente lo que hace es enviar diferentes configuraciones por sftp a cada una de las diferentes IP. Te he contado todo esto para justificarte el por que necesito grabar SD diferentes, pues en realidad la unica diferencia de cada SD es la IP que tendra asignada, por lo que de esta manera tendría en mi disco duro 15 imagenes de 16 gb cada una, la gran ventaja de esto, a parte de que grabaría 15 imágenes simultaneas, es que cada imagen tendría una IP, por lo que nada mas grabar las 15 las colocaría en unas placas wifi que yo tengo en mi sistema de redes y lo unico que tendría que hacer es mandar con el winscp un patrón de configuraciones, la diferencia como supondrás es abismal, esto que te comento podría llevarme una tarde fácilmente de trabajo y con este sistema estimo que en una hora y algo estaría listo.

He intentado yo modificar el programa para hacer una prueba y ver si esto era viable, pero me sucede una cosa, ¿recuerdas qué el programa tiene 2 opciones de grabación simultanea? (La opcion 2 y 3) pues he intentado crear 15 opciones y en cada opción colocar una ruta para cada SD diferente, en principio comienza a grabar cuando entro en cada una de las opciones, pero cuando finalizan las grabaciones tan solo se me graba la primera SD a la que le di a grabar, el resto no se graban correctamente, y sin embargo en las barras de progreso parece ir todo bien, he pensado que quizás que al entrar a otra opción mientras esta grabando lo que hace es parar el proceso de grabación, y quizás este método no sea el mejor, seguramente haya que crear una opción que asigne de golpe cada una de la imágenes a cada unidad de grabación.

Te comento esto para ver si existe alguna solución de mejora, de no ser posible no pasa nada, bastante trabajo me esta quitando ya el programar.

1 Respuesta

Respuesta
1

Yo te sugeriría que probaras algo más controlable, como dos o tres grabaciones simultáneas. Dices que si lanzas 15 con distintos orígenes y no sé si también destinos distintos (no recuerdo si alguna de esas opciones permitía esa posibilidad) y que aparentemente todas parecen ir bien desde el punto de vista de la barra de progreso, pero que solo acaba bien la primera. ¿Qué error o errores dan las otras (creo recordar que eso se podía ver en el log correspondiente)?

En principio se me ocurre que el problema sea del programa que hace la copia (el CommandLineDiskImager.exe), que no maneja bien la ejecución simultánea de varias "instancias", o tal vez del BAT que lo lanzaba (el CLDIW_C). A lo mejor para este caso concreto es mejor hacer algo más "ad hoc" y no algo tan ambicioso como el menú que nos montamos. Pero tú cuéntame y veré si se me ocurre algo.

He realizado diferentes pruebas y te paso los resultados:

Voy a grabar 4 SDs simultaneas, para ello voy a usar las unidades E, G, H, e I como se puede ver en la foto:

Ahora ejecuto el programa, no se si recordaras el menu de opciones, las opciones 2 y 3 estaban pensadas para poder grabar 2 tipos de imágenes distintas de forma simultanea, y la opcion 4 me permitía especificar la ruta de una imagen y grabarla en una unidad libre:

La verdad que tal como me comentaste en su día no tiene demasiado sentido la opción 4, pero bueno ahí esta.

Pues las  opciones 2 y 3 son las que más uso, lo que pasa que una vez que inicio la grabación en la opción 2, luego al intentar entrar en la opcion 3 para grabar otras imágenes distintas pues no me graba correctamente esas SDs de la opcion3, la buena noticia es que en la opción 2 me graba correctamente todo, no importa el numero de SD que le meta, lo que si suele ocurrir al grabar muchas SDs es que alguna barra de progreso se queda pillada sin progresar, pero no tiene mayor importancia ya que se graban correctamente la SD, ademas las grabaciones terminan prácticamente a la vez y con ver una barra ya se cuando acabaran las demás.

Bueno en esta primera prueba voy a lanzar la segunda opción y la tercera haber si se graba todo correctamente:

-A la opcion 2 le he asignado las 3 primeras unidades (E, G y H) como ves en la imagen todo correcto

-Ahora lo que hago es darle a continuar para entrar en la opcion 3 y grabar la unidad I con otra imagen distinta, como ves en la imagen no me da ningun tipo de error en la unidad

-Aqui en esta imagen puedes ver por ejemplo como se queda pillada la barra de progreso de la unidad H en el 26%, pero como te digo no tiene mayor importancia porque continua grabandose en realidad y termina a la misma vez que las demás:

-Ahora ya se ha grabado todo y los mensajes son correctos:

Ahora veré si se ha grabado la unidad I, que es la opción que falla y vere los logs:

Una de las cosas que me llama la atencion despues de las grabaciones es que las unidades de mi equipo se vuelven un poco locas, no se si tendrá algo que ver la forma en que grabamos, pero tanto si se ha grabado bien las SDs como si se graban mal lo que me ocurre es lo siguiente:

Cuando inserto la SD en el equipo me sale la unidad (esta es la E) pero me aparece una unidad fantasma siempre, a veces es una G y aveces una J, y me bombardea el mensaje de si quiero formatear, pero ya te digo que esta SD se ha grabado bien, puede que sea conflicto de mi pc con los puertos...

Bien, ya tengo el resultado de las grabaciones, y me he llevado una grata sorpresa, he comprobado el contenido de las 4 SD y es el correcto, las 3 primeras tienen su imagen y la SD "I" tiene también su imagen, por lo que se ha grabado correctamente. ¿Que es lo que ha pasado? pues resulta que en esta prueba  he decidido coger otra version del programa de las tantas que tengo porque estuve haciéndole cambios a los PINGS y alguna que otra cosa mas, y esta versión que me funciona la descarte hace un tiempo porque me fallaba, pero hace poco descubrí que loas adaptadores de SD que yo usaba me daban problemas (son del alliexpres) a si que cambie por unos de más calidad, el problema que he venido usando un programa que seguramente no funcionaba bien y al probar la otra versión si que me funciona!! haré algunas pruebas más para confirmar que no da problemas, te paso el error que me daba la version que funcionaba mal por si tienes curiosidad, el archivo logtmpI.log dice lo siguiente:

Excepci¢n al llamar a "Substring" con
los argumentos "2": "StartIndex no
puede ser inferior a cero.
Nombre del par metro: startIndex"
En l¡nea: 1 Car cter: 68
+ ... lect-Object -last 1; Write-Host
$mystr.substring($mystr.length-$N,$N)
+ ~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpeci
fied: (:) [], MethodInvocationExce
ption
+ FullyQualifiedErrorId : Argument
OutOfRangeException

Te dejo el código del que a mi me funciona bien en este enlace:

https://mega.nz/#!wJ90FBBJ!ymzkvB2MHgmlBmj7hD6mS8d06ohCL-ezGX-yfYwV2-8

De momento si esto funciona, supongo que podré implementar sin problema las 15 grabaciones simultaneas, el problema que no se como plantear la grabación para que sea lo más automatizada posible.

Se me ocurren algunas ideas pero no se si se podrán implementar en el menú, por ejemplo poner diferentes lineas en el archivo .ini de configuración en el que yo preconfiguro las 15 rutas distintas y a que unidad va asociada cada ruta, por ejemplo:

-Ruta1:D:\Imagenes SD\Exclusivas la campana v2.0

 Unidad1: H

-Ruta2:D:\Imagenes SD\ExclusivaTrebol

 Unidad2: G

-Ruta3:D:\Imagenes SD\Imagen_N_Diciembre

 Unidad3: I

Y una vez configurado esto desde el menú solo tengo que entrar en la opción 7 por ejemplo y me debería lanzar estas grabaciones, y a la hora de confirmas estas grabaciones si hay alguna manera de que pueda confirmas las 15 grabaciones de golpe sin tener que estar 1 tras otra aceptando el mensaje de ¿esta seguro que quiere formatear la unidad X? por que seria muy pesado hacer esto 15 veces, seguramente haya alguna manera de preguntarlo una vez para las 15 unidades.

Por cierto el archivo .ini que me creastes me resulto muy útil y cómodo para configurar mis opciones de grabación!

Saludos!

Me alegraré si finalmente la cosa marcha, pero si tienes algún problema puedes contármelo a ver si se me ocurre algo.

Respecto al "problema" del mensaje de Windows de "Formatee el disco..." a mí también me salía cuando lo que grababa no tenía el formato de una unidad de Windows. Yo creo que estas utilidades de clonación son transparentes al formato de lo que se está grabando pero al terminar la grabación y devolver el control de la unidad a Windows a veces no sabe que hacer con ellas porque no reconoce el formato.

En cuanto al error del log es un error del código de Powershell insertado en el GRABCONT.BAT:

@PowerShell  ^
   $N = %ncar%; ^
   $mystr = Get-Content 'Grab%1.log' ^| Select-Object -last 1;  ^
   Write-Host $mystr.substring($mystr.length-$N,$N) > logtmp%1.log
%End PowerShell%

Parece indicar que el índice de inicio de la subcadena que se le pide a ese código (el $mystr.length -  $N) es menor que cero, porque todavía no se han escrito tantos caracteres en Grab%1.log como los que se indican en %ncar%. Podría ser que el ping de espera (npin1lec) sea insuficiente o que hay algún problema en la grabación.

Hola,te confirmo que la version que te he pasado graba perfectamente, decir que he tenido que ajustar los PING de espera para Windows 7 esta es la configuración:

Número pings inicial para obtención bloques totales=2
Número pings de espera a primera lectura=7
Número pings bucle espera siguiente lectura=7

y en Windows 10:

Número pings inicial para obtención bloques totales=1
Número pings de espera a primera lectura=10
Número pings bucle espera siguiente lectura=10

si modifico alguno de estos parametros ya me comienza a dar errores en alguna grabación, por lo que de momento va bien.

Entonces, ¿es posible lanzar varias grabaciones simultaneas pre-asociando cada imagen distinta a una unidad?

¿Te refieres a la vía a través del .INI que comentabas? En principio, por lo que comentas, parece que sí, pero, igual que en el ajuste de estos parámetros configurables, creo que debes "tomar el mando" para intentar desarrollar por tu cuenta esta "opción 7". No tendré ningún problema en ayudarte si lo necesitas y si puedo hacerlo. Por cierto que esos parámetros pueden depender no solo de la versión de SO sino de la velocidad de proceso de cada máquina (número de procesadores, bus de 64 o 32 bits, etc.)

Si me refería a esa opción del .ini, intentare modificar el código para crearme diferentes perfiles de grabación e intentar configurarlo desde el .ini, asique me pondré a ello y si consigo algo ya te comentare, gracias!

Muy bien. Si tienes algún problema me lo cuentas.

Hola! Te cuento mis progresos:

Lo primero he implementado en el menú una opción más, la he puesto en la intentar 4:

He tenido que cambiar nombres a variables y mover de lugar el resto de elementos, también he creado variables nuevas en el archivo .ini:

Lo que hecho es crear una variable para cada unidad y con su ruta justo debajo, como te comente lo que necesito es grabar 15 imágenes distintas simultáneamente, para la prueba voy a usar 4 imágenes distintas.

Esta parte me costo que me funcionara porque yo no sabia como funciona el archivo .ini y estuve 2 días con esto, hasta que descubrí que va por líneas, al final he conseguido que me funcione.

Bien el problema lo tengo en el tratamiento de la grabación, ya que lo que hace el programa es asignar la ruta de la imagen a una unidad disponible, y lo que yo necesito es que cada unidad ya tenga prefijada su imagen, estuve retocando el código para la opción 4 pero no consigo bien entender como funciona, esto es lo que tengo hasta ahora:

:grabarIP
cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
¿Echo ¨Unidades d¢nde realizar la grabaci¢n?
set /p unidades3=May£sculas y separadas por coma y espacio (%unidadIP60%)(%unidadIP61%)(%unidadIP62%) 
if not "%unidades3%"=="" set unidadIP60=%unidades3%
set unidades3=%unidadIP60%
:sig3
for %%u in (%unidades3%) 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 :grabar3
)
rem echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
:grabar3
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 grabaci¢n en ! Unidad!: %Date% %time%
start /b "" cldiw_c ! Unidad! "%RutaA%"
goto :eof

La parte primera de ese código la entiendo, de hecho he estado haciendo pruebas y me aparecen las unidades y las rutas, la parte que no consigo entender es cuando empieza la linea :sig3, aquí por lo visto toma las unidades disponibles y las prepara para la grabación, luego en la linea de :grabar3 es para comenzar la grabación de la ruta que yo le especifique, con lo cual

¿Si yo quiero grabar de golpe 4 imagenes en 4 unidades, lo que tengo que hacer es modificar la parte de :sig3?

Disculpa si no me he expresado bien pero me ha costado bastante llegar hasta aquí y la mayoría de cosas que he aprendido es a base de ensayo y error.

Gracias

Te acabo de escribir y no ha llegado el mensaje,me tocará explicar todo de nuevo vaya faena.

Por lo visto si que ha llegado, disculpa.

A veces la página hace cosas raras con los nuevos mensajes. Y a veces desgraciadamente se pierde lo que has escrito, cosa que resulta muy molesta porque volver a escribir más o menos lo mismo es muy desagradable. Cuando me acuerdo copio el texto antes de darle a Enviar por si acaso, pero aún así a veces se me olvida esa precaución y me toca aguantarme.

A ver si tengo un rato y te puedo echar una mano. Estos días estoy un poco ocupado y no puedo asegurarte que pueda dedicarte mucho rato. Así, de momento, te diría que si toda la información la extraes del .INI no parece ser muy necesario el SET /P ni el IF posterior porque el primero es para pedir que se teclee algo y el segundo para controlar que se ha tecleado algo válido. Si quieres usar directamente la información del .INI yo haría algo como:

:GrabarIP
Cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
Start /b "" cldiw_c %UnidadIp60% "%RutaIp60%"
Start /b "" cldiw_c %UnidadIp61% "%RutaIp61%"
Start /b "" cldiw_c %UnidadIp62% "%RutaIp62%"
Start /b "" cldiw_c %UnidadIp63% "%RutaIp63%"

Con esto no tienes ningún control y puede ser que las unidades en cuestión no estén disponibles pero luego puedes incorporar los controles si esto ya te funciona. Las complicaciones de las otras opciones del menú tienen que ver con el control. Si esta opción te parece que no lo necesita (o que puede ser más "liviano") se puede aligerar el código. Mira a ver si te funciona y me dices.

No te preocupes, no tengo ninguna prisa, cuando tu puedas me vas comentando.

Pues efectivamente esa manera de grabación que me propones es mucho más directa, ya le he borrado todo lo relacionado con el control para simplificar el proceso y esto realizando varias grabaciones simultaneas para asegurarme que lo hace bien.

Estoy grabando 4 SDs simultaneas, cada una con su imagen, y pare que todo marcha bien, pero he tenido algunos problemas pues a veces algunas unidades me lanzan un error al inicio de la grabación, y esto es lo que me dice el  el logtmpX.log

error - not able to lock volume
error - can't get a lock on volume

Esto solo me sucede de vez en cuando.

Otro tipo de error que me sucede mas a menudo es que comienza a grabar las 4 unidades sin problemas, todo parece que marcha bien hasta que en una unidad determinada (suele ser la misma) cuando va por el 14% aprox se sale de la grabación y en el log me muestra el siguiente mensaje:

error - not able to write data from handle
error - error whilst writing

Todavía no tengo claro  si es un problema del tratamiento de la grabación de varias unidades simultaneas o es defecto de grabación por culpa de la SD y las unidades de windows, me decanto más por la segunda opción ya que he conseguido que se graben correctamente las 4 unidades después de estar cambiando de SD, o cambiando de sitio las unidades extraibles y formateando las unidades, cuando saque algo mas en claro te lo comentaré.

Esto me lleva a la conclusión de que necesitare algún tipo de control que me de cierta garantía durante las grabaciones, es decir, si me suele fallar siempre alguna SD de las 15 que estoy grabando no me importa ponerla a grabar nuevamente porque entiendo que aveces puede ser culpa de la SD, de un conflicto puntual de las unidades de windows o que el CommandLine se quede pillado durante una grabación, pero lo que si necesito es que después de que me haya fallado como volver a grabar esas 2 o 3 grabaciones fallidas sin tener que abortar el proceso de las 15 grabaciones y el lió que eso conlleva (al tener otro formato tengo que formatear una a una las SDs y windows me bombardea con cientos de ventanas diciéndome si quiero formatear y con errores de unidad)

Por lo que una posible solución seria esperarme a que finalicen las SDs que si se están grabando (que por cierto se graban muy bien y de forma muy rápida) y cuando termine la grabación volver a grabar de alguna manera solo las imágenes fallidas, si esto no fuese posible quizás haya alguna manera de que no comience la grabación de las 15 SDs hasta que todas las unidades no estén correctamente, para esto quizás haga falta crear primero una especie de mini programa de test y lanzarlo antes de comenzar la grabación.

Por lo demás lo veo todo bien, me gusta que de forma directa pueda darle a grabar a 15 imágenes teniendo previamente sus imágenes preconfiguradas.

Saludos.

Por las pruebas que estoy haciendo veo que son frecuentes los errores al inicio de la grabación y me muestra el mensaje

error - not able to lock volume
error - can't get a lock on volume

Estoy pensando que c el error puede tener que ver con la forma de grabación tan seguida de todas las imágenes a la vez, quizás con un retardo entre cada una de las grabaciones se podría quitar este error. Además algo que justifica aun más esto es que al grabar las mismas 4 SDs con las demás opciones del programa me las graba sin problemas ¿Qué opinas tu?

No sé. Habría que hacer pruebas. El mensaje de error lo considero relacionado con la necesidad del programa grabador de bloquear la unidad en la que va a grabar y ese bloqueo puede verse impedido por otros programas, por ejemplo por el explorador de Windows. Para probar cerraría todas las ventanas excepto la de ejecución del bat. Tampoco puede descartarse que el bat de control de progreso tenga algo que ver, aunque no me imagino de qué manera.

Ahora soy yo el que ha perdido una respuesta. Intentaba decirte que no sé cual puede ser la causa. Por el texto del mensaje de error diría que el programa que intenta grabar las imágenes se encuentra con que no puede bloquear la unidad, algo que necesita para realizar la grabación sin interferencias. En principio debería ser porque algún otro programa está accediendo a ella. Si no lo has hecho ya, prueba a tener todas las ventanas cerradas, excepto la del propio menú. Yo no veo razón para que la grabación en una unidad impida el bloqueo de otra, a no ser que compartan alguna especie de clúster o hub físico. Creo que tendrás que probar todo lo que se te ocurra para intentar "diagnosticar" el problema.

Hola!! Yo siempre antes de mandar el mensaje tomo la precaución de copiarlo porque la pagina esta te deja "tirado" cuando menos tiempo tienes.

He hecho pruebas cerrando todas las ventanas e incluso apagando servicios de windows innecesarios, pero me sigue fallando una de las unidades durante la grabación, así que he optado por comprobar una de mis sospechas y era que yo creo que no se le da tiempo suficiente al proceso para que trate las grabaciones de cada una de las imagenes y entonces siempre alguna de las unidades quedaba "fuera" del proceso, la principal prueba de ello es que  las bajo mismas condiciones algrabar con la opcion 2 o 3 del programa si que me las graba bien, y la unica diferencia es que estas opciones tienen un control que evita que las grabaciones sean simultaneas.

Pues para comprobar esta sospecha he puesto lo siguiente:

:grabarIP
Cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
PING 192.168.1.210 -n 1 -w 3000 >NUL
Start /b "" cldiw_c %UnidadIp60% "%RutaIp60%"
PING 192.168.1.210 -n 1 -w 3000 >NUL
Start /b "" cldiw_c %UnidadIp61% "%RutaIp61%"
PING 192.168.1.210 -n 1 -w 3000 >NUL
Start /b "" cldiw_c %UnidadIp62% "%RutaIp62%"
PING 192.168.1.210 -n 1 -w 3000 >NUL
Start /b "" cldiw_c %UnidadIp63% "%RutaIp63%"

La única manera que conozco en batch para hacer retardos es colocando una IP que no exista en mi red, de esta manera al no existir se mantendra un tiempo en milisegundos, seguramente no sea la manera más elegante pero avista del programa queda muy bien pues me van apareciendo las unidades de grabación una tras otra, pues de esta manera si me las graba bien, he probado varias veces para estar seguro, y siempre que le quito el comando de PING me falla una unidad y al colocárselo se acaba el error ese.

No se si el problema era exactamente eso, pero de momento esta engañifa me permite grabar las imágenes sin problemas en el inicio de grabación.

Intentare a partir de ahora complicar un poco mas el asunto añadiendo mas SDs y haciendo algún control general para la grabación.

De momento le he hecho un control sencillo, realmente no necesito más:

:grabarIP
Cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
echo.
echo.
echo Se va a proceder a la grabaci¢n de las siguientes unidades: %UnidadIp60%, %UnidadIp61%, %UnidadIp62%, %UnidadIp63% en: %date% %time%
set /p Es_grabar= Por lo que se va a proceder a formatear ¨Seguro (S/N)? 
if not %Es_grabar%==S if not %Es_grabar%==s goto inicio_menu
PING 192.168.1.210 -n 1 -w 1500 >NUL
Start /b "" cldiw_c %UnidadIp60% "%RutaIp60%"
PING 192.168.1.210 -n 1 -w 1500 >NUL
Start /b "" cldiw_c %UnidadIp61% "%RutaIp61%"
PING 192.168.1.210 -n 1 -w 1500 >NUL
Start /b "" cldiw_c %UnidadIp62% "%RutaIp62%"
PING 192.168.1.210 -n 1 -w 1500 >NUL
Start /b "" cldiw_c %UnidadIp63% "%RutaIp63%"
goto inicio_menu

Lo que si necesitaría es que en las ventanas de las barras de progreso me indicase el nombre de la imagen que se esta grabando y si no fuese posible, poner aunque sea la ruta de la grabación, porque si ahora voy a tener decenas de ventanas con un progreso, necesito tener claro a que imagen corresponde cada ventanita.

Saludos

Si repasamos la forma de lanzar las grabaciones vemos que se hace con:

Start /b "" cldiw_c %unidad% "%RutaImg%"

Invocando a CLDIW_C pasándole como primer parámetro la unidad y como segundo parámetro la ruta de la imagen (con el nombre incluido).

Desde el cldiw_c.bat se lanza la grabación y el control. Este último con:

Start "Control grabacion unidad %1" GrabCont %1

El título de la ventana incluye el literal "Control grabacion unidad" seguido de la propia unidad (que se recibió como primer parámetro en la invocación. Podrías probar a pasar todo o parte del segundo parámetro (la ruta de la imagen). Algo como "Imagen %nx2". Pero el propio GrabCont incluye un comando TITLE (title=GrabCont%1) que tal vez prevalezca. Si fuera así puedes "comentarlo" precediéndolo de un "rem". No ando sobrado de tiempo para hacer pruebas al respecto de modo que solo te lo sugiero para que lo pruebes.

En cuanto al uso del ping para generar retardos es algo muy utilizado. De hecho se hace uso de ese método en los bat de este "proyecto", aunque en lugar de hacer el ping a una IP inexistente yo lo hago a localhost (que siempre existe) incluyendo en el parámetro "n" el número de intentos (que en este caso se traducen en segundos).

Entiendo lo que me quieres decir pero no entiendo el proceso, haber si no he entendido algo:

Dices que las grabaciones se inician con Start /b "" cldiw_c %unidad% "%RutaImg%", pero en esta nueva opción de menú cada unidad va asociada a una ruta o imagen con lo cual seria:

Start /b "" cldiw_c %UnidadIp60% "%RutaIp60%"

Start /b "" cldiw_c %UnidadIp61% "%RutaIp61%"

...

Con lo cual, si yo voy al archivo GRABCONT.bat, entiendo que si le añado por ejemplo la ruta "%RutaIp60%" siempre me va a mostrar de nombre de ventana esa misma ruta que corresponde a una determinada imagen.

Puede que te haya entendido mal pero ahora mismo no doy pie con bola.

Por las pruebas que he podido hacer el titulo del GRABCONT si prevalece, lo que hecho es ponerle rem, y después he puesto lo siguiente:

echo Control Grabacion "%RutaImg%"
set bar=±±±±±±±±±±±±±±±±±±±±
for /l %%i in (1,1,%cuadros%) do set bar=²!bar!
echo %bar:~0,20% %porcentaje%%% grabado
if %porcentaje% geq %maxporc% goto :fin
ping -n %npinlec% localhost >nul
goto :bucle
:fin
pause

y en la grabacion no aparece nada:

y al usar esto: 

"%RutaIp60%"

Si que me aparece la ruta en la ventana, pero claro siempre me aparecería la misma:

Saludos.

No hombre, no me refiero a que pongas "a pelo" esos valores. Lo que quiero decir es que, aprovechando que se le pasan al CLDIW_C.BAT, se puede modificar el arranque del GRABCONT para que use esa información. En concreto en lugar de:

Start "Control grabacion unidad %1" GrabCont %1

Poner algo como (se me había olvidado la "virgulilla", el carácter "~"):

Start "Imagen %~nx2" GrabCont %1

Por si no lo sabes si se insertan dentro de la invocación a un parámetro tipo ruta (como el %2 en este caso) cosas como "~nx" se le está diciendo que se quede solo con el nombre (la "n") y la extensión (la "x"). Pero no es "a pelo" sino que lo extrae de los parámetros que se le pasan. Teóricamente, si funcionara como se espera, en el "caption" o título de la ventanita de la barra de progreso, debería decir "Administrador: Imagen Imagen_N_Diciembre" en lugar de lo que dice ahora "Administrador: Control grabacion unidad G". Por el ejemplo que pones el TITLE del GRABCONT no parece prevalecer, de modo que esto podría valer.

También podría valer tu opción de hacer un echo directamente en la ventana, pero no sería un echo directamente de una variable "cargada" previamente sino el echo del parámetro de invocación. Algo como

Echo %2

Pero entonces habría que pasar al GRABCONT además de la unidad también la ruta o el nombre de la imagen (cosa que ahora no se está haciendo). Si funciona la primera opción creo que sería más sencilla.

Vale, y en esta sentencia en concreto que tengo que sustituir? 

Start "Imagen %~nx2" GrabCont %1

En donde esta la n coloco el nombre del archivo? y en la x pongo la extensión?

Perdona pero en esto ya si que no me entero de nada, por eso lo he pillado todo literal.

Genial! Ya voy consiguiendo algo, poniendo tal cual lo que me has pasado me aparece en la cabecera de las ventanas el nombre de la imagen:

Lo idealseriaque se viera en la parte interior de la ventana ya que se ve más, pero de momento bien, intentare yo ahora haber si soy capaz ponerlo dentro también.

Disculpa por ser tan pesado pero es que no sabia nada de lo que me estabas comentando y al final a base de equivocarme 20 veces doy con las cosas, al explicármelo lo he entendido la función de esos caracteres.

Al intentar colocar esa misma variable en el "Control Grabacion unidad: %1" no me muestra nada, por lo visto hay que traer de otra forma el nombre de la variable "imagen" de otra manera, pero bueno de momento me conformo con verlo en la barra de la ventana, me has ayudado bastante, mil gracias!!!

No te preocupes. No tengas ningún temor de preguntarme cualquier cosa. Pero tampoco menosprecies la propia ayuda de MSDOS, aunque es cierto que a veces es bastante ininteligible. Por ejemplo prueba a teclear FOR /? en una ventana MSDOS y verás que una de las cosas que dice (hacia el final) es:

 %~NxI - expande %I sólo a un nombre de archivo y extensión

Esto es, básicamente, lo que te conté de %~nx2 para el %2.

Para que se viera dentro de la ventana (el ECHO que probaste) habría que pasarle un segundo parámetro al GRABCONT, la ruta o el nombre de la imagen además de la unidad. No es complicado pero te obliga a cambiar no solo el CLDIW_C.BAT sino también el GRABCONT.BAT. Pero a medida que le vayas pillando el truco a esto verás que es solo cuestión de probar hasta acertar.

Me gusta como queda al mostrarme la imagen que estoy grabando en la parte superior de la barra, pero me molesta en la visibilidad de la barra eso que pone de "administrador:" ¿se puede quitar eso para que solo quede el nombre de la imagen?

Yo no lo he conseguido, y lo he intentado bastante. Si lo consigues cuéntamelo.

Buscare información, el problema es que cada vez que entras como administrador aparece el mensajito, y tiene que haber alguna forma de librarse de el, si veo algo interesante te lo comentaré.

he estado viendo el comando runas

Ejemplos:
> runas /noprofile /user:mymachine\administrator cmd
> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
> runas /env /user:[email protected] "notepad \"mi_archivo.txt\""

Y he pensado que quizás si hay alguna forma de ejecutar el .bat con privilegios pero evitando dar clic derecho y ejecutarlo como administrador puede que el "administrador" de la ventana de esta forma no aparzca.

Hola de nuevo!! necesito ayuda para colocar el nombre de la imagen que estoy grabando dentro de la ventana de control, me comentaste que hacia falta crear un parámetro, en esta entrada me lo explicaste:

"Para que se viera dentro de la ventana (el ECHO que probaste) habría que pasarle un segundo parámetro al GRABCONT, la ruta o el nombre de la imagen además de la unidad. No es complicado pero te obliga a cambiar no solo el CLDIW_C.BAT sino también el GRABCONT.BAT.

Estuve intentando quitar el mensaje de administrador sin éxito, por eso voy a optar por dejar el nombre de la imagen dentro para que se vea de forma más clara, pero la verdad no se por donde empezar, necesito solamente eso, por lo demás funciona todo perfectamente.

Gracias.

Creo que esto sería lo que habría que hacer.

En CLDIW_C.BAT sustituir

Start "Control grabacion unidad %1" GrabCont %1

por

Start "Control grabacion unidad %1" GrabCont %1 %2

Y en GRABCONT.BAT sustituir

Ping -n %npin1lec% localhost >nul
:Bucle

por

Ping -n %npin1lec% localhost >nul
Echo %2
:Bucle

Mira a ver si se ajusta a tus necesidades.

Feliz Año 2018

Hola, no me funciona, he cambiado lesos 2 parametros y no muestra el nombre de la imagen. Te lo pono tal cual lo tengo:

cldiw_c.bat:

@echo off
Setlocal EnableDelayedExpansion
title=cldiw_%1
set carpCLDI=c:\tmp\ggg
set nPinEspera=5
if exist menusd.ini call :config
if #%1#==## goto :sinDisco
if not exist %2 goto :sinImagen
Start "Control grabacion unidad %1" GrabCont %1 %2
"%carpCLDI%\CommandLineDiskImager.exe" %2 %1 > Grab%1.log
if errorlevel 1 goto :error
if errorlevel 0 echo.&echo Ha terminado la grabacion en %1: %date% %time%
goto :fin
:error
echo.
echo.
echo.
echo Ha habido error(es) en la grabacion en %1: %date% %time%
for /f "tokens=3,4,5,6,7,8,9" %%a in ('type Grab%1.log ^| find "error"') do (
   if %%a == file echo Error: archivo no encontrado
   if %%a == device echo Error: unidad no montada
   if "%%d %%e" == "for volume" echo Error: identificador de volumen inv lido
   if %%b == get echo Error: no se ha podido solicitar el bloqueo del volumen
   if %%b == unmount echo Error: no se ha podido desmontar el volumen
   if "%%d %%e" == "for file" echo Error: identificador de archivo inv lido
   if "%%d %%e" == "for disk" echo Error: identificador de disco inv lido
   if %%b == enough echo Error: no hay espacio suficiente en la unidad
   if %%a == data echo Error: imagen vac¡a
   if %%a == error echo Error: problemas en la grabaci¢n
   if %%b == image echo Error: no se ha indicado archivo a grabar
   if %%g == image echo Error: no se ha podido obtener identificador para el archivo
   if %%g == device echo Error: no se ha podido obtener identificador para la unidad
   if %%g == volume echo Error: no se ha podido obtener identificador para el volumen
   if "%%d %%e" == "lock volume" echo Error: no se ha podido bloquear el volumen
   if %%d == unlock echo Error: no se ha podido desbloquear el volumen
   if %%d == dismount echo Error: no se ha podido desmontar el volumen
   if %%d == read echo Error: no se han podido leer datos
   if %%d == write echo Error: no se han podido grabar datos
   if %%e == number echo Error: no se ha podido obtener el n£mero de sectores
   if %%e == image echo Error: no se ha podido obtener el tama¤o de la imagen
   if "%%f" == "number," echo Error: no se ha podido obtener el n£mero de unidad, ¨est  en uso?
   if "%%f" == "properties," echo Error: no se han podido obtener las propiedades de la unidad, ¨est  en uso?
)
ping -n %nPinEspera% localhost > nul
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
:config
for /f "skip=1 tokens=2* delims==" %%a in (menusd.ini) do (
call :leerparam %%a
goto :eof
)
:leerparam
set npar=0
for /f "skip=%1 tokens=2* delims==" %%a in (menusd.ini) do (
if !npar!==0 set carpCLDI=%%a
if !npar!==1 set nPinEspera=%%a
set /a npar+=1
)
goto :eof

GRABCONT.bat:

@echo off
Setlocal EnableDelayedExpansion
title=GrabCont%1
set nlin=4
set ncol=40
set npinic=1
set npin1lec=10
set npinlec=10
set maxporc=98
set ncar=50
if exist menusd.ini call :config
mode con lines=%nlin%
mode con cols=%ncol%
ping -n %npinic% localhost >nul
for /f "tokens=2* delims=/" %%a in ('type Grab%1.log') do set max=%%a
set cifra=%max%
set /a cifMax=1
:cuentacifras
set cifra=%cifra:~1%
if defined cifra set /a cifMax+=1&goto:cuentacifras
Ping -n %npin1lec% localhost >nul
Echo %2
:Bucle
@PowerShell  ^
   $N = %ncar%; ^
   $mystr = Get-Content 'Grab%1.log' ^| Select-Object -last 1;  ^
   Write-Host $mystr.substring($mystr.length-$N,$N) > logtmp%1.log
%End PowerShell%
for /f "tokens=*" %%a in ('type logtmp%1.log^|find "/"') do set grabados=%%a
set /a pos=1
set ind=n
:buscar
set car=!grabados:~-%pos%,1!
if %car%==/ (
   if %ind%==s (
      goto :seguir
      ) else set ind=s&set /a aux=%pos%
)
set /a pos+=1
goto :buscar
:seguir
set /a aux=%pos%-%aux%-%cifMax%-1
set /a pos=%pos%-%cifMax%-1
set grabados=!grabados:~-%pos%,%aux%!
set /a porcentaje=(%grabados%/10)/(%max%/1000)
set /a cuadros=%porcentaje%/5
cls
echo Control Grabacion unidad %1:
set bar=±±±±±±±±±±±±±±±±±±±±
for /l %%i in (1,1,%cuadros%) do set bar=²!bar!
echo %bar:~0,20% %porcentaje%%% grabado
if %porcentaje% geq %maxporc% goto :fin
ping -n %npinlec% localhost >nul
goto :bucle
:fin
pause
exit
:config
for /f "tokens=2* delims==" %%a in (menusd.ini) do (
call :leerparam %%a
goto :eof
)
:leerparam
set npar=0
for /f "skip=%1 tokens=2* delims==" %%a in (menusd.ini) do (
if !npar!==0 set nlin=%%a
if !npar!==1 set ncol=%%a
if !npar!==2 set npinic=%%a
if !npar!==3 set npin1lec=%%a
if !npar!==4 set npinlec=%%a
if !npar!==5 set ncar=%%a
if !npar!==6 set maxporc=%%a
set /a npar+=1
)
goto :eof

Gracias!!

Feliz año 2018!!

Es que no ubiqué bien el echo %2 en GRABCONT.BAT.

Debería estar aquí:

Echo Control Grabacion unidad %1:
Echo Grabando imagen %2
set bar=±±±±±±±±±±±±±±±±±±±±

Le he añadido un texto "Grabando imagen". Esto ya lo he comprobado en mi "entorno de pruebas" y debe funcionar. Es que me daba cierta pereza refrescar mi memoria, pero al final es la mejor manera de hacer las cosas, vencer la pereza

Perfecto! Ya funciona, me resulta realmente cómodo ver que imagen se graba en cada ventanita y además su progreso.

Por cierto, ¿los logs que se generan durante la grabación se pueden colocar en otra carpeta? Es que cuando grabo más de 10 sd simultaneas como se generan 3 logs por cada grabación a veces me cuesta hasta encontrar el "menuSD.bat" jajaj.

Un saludo!

Obviamente. En este mundo informático todo, o casi todo, se puede hacer con mayor o menor dificultad. Nuevamente habría que retocar el CLDIW_C y el GRABCONT. Las líneas afectadas serían, para el primero:

"%carpCLDI%\CommandLineDiskImager.exe" %2 %1 > Grab%1.log
...
for /f "tokens=3,4,5,6,7,8,9" %%a in ('type Grab%1.log ^| find "error"') do (

Y para el segundo:

for /f "tokens=2* delims=/" %%a in ('type Grab%1.log') do set max=%%a
...
   $mystr = Get-Content 'Grab%1.log' ^| Select-Object -last 1;  ^

En general cualquier línea donde se hable de "Grab%1.log" (por si se me escapa alguno). Y ya puestos podría ser un parámetro del INI, como el "carpCLDI". Pero eso te lo dejo a ti.

Perfecto mil gracias!! haré pruebas y lo dejare a mi gusto.

Saludos!

Muy bien. Suerte. Si tienes alguna dificultad me lo cuentas, si quieres.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas