Problemas con el tamaño de las imágenes

Yo de vacaciones y vuelvo a la carga con un pequeño problema que me esta dando el programilla de grabación de SD, te lo contare lo más claro posible ya que es un poco lioso de explicar, además que me ha costado bastante descubrir y demostrar este problema, ya que desde hace un tiempo mientras realizaba grabaciones siempre misteriosamente había un grupo de SD que no se grababan, y luego por separado si se grababan y no entendía que estaba pasando.

Parece ser que el origen del problema reside en el tamaño de las SD, resulta que yo compro lotes de SD que "teoricamente" tienen el mismo tamaño, pero todos sabemos que esto no es así, y que los 16 GB se convierten en 14,9 GB útiles, hasta aquí bien, el problema comienza cuando a la hora de realizar mis archivos de imagen de la SD, en el proceso de la copia de la imagen se usa TODO el espacio de la SD, con lo cual si la imagen la he creado con una SD que tiene 14,8 GB de espacio útil, la imagen resultante me ocupará 14,8 GB, esta imagen como supondrás, la empleo para las grabaciones de SD que están en blanco, es decir hago clonaciones, de ahí la importancia del programa que tu realizaste ya que voy infinitamente más rápido, el problema viene ahora, ya que el espacio de las SD de fabrica varia, y basta solo con que tenga 1 o 2 kilobytes menos para que no me permita grabar una imagen que tiene más tamaño.

Como las SD vienen de forma aleatoria con un tamaño o con otro, la cosa se complica, ya que al realizar yo una imagen con un tamaño de una SD, hay veces que si que puedo grabar y otras que no me deja grabarlas, y tendría que buscar la SD con el menos espacio posible para que al realizar la imagen no me diera problemas con el resto de las SD,

Esto antes cuando grababa las SDs de una en una no era demasiado problema, ya que si una no se grababa por el tema de espacio, pues las iva apartando y cogía otra, el problema real lo tengo ahora ya que al grabar 7 SD de golpe con el programa de grabación, basta que una sola SD tenga un tamaño algo inferior que la imagen para que al grabarlas "aparentemente" están todas las SD grabadas pero luego me doy cuenta que algunas SD permanecen en blanco ya que por el tamaño no se pudo completar la grabación de forma correcta, y claro luego se me mezclan SDs grabadas bien con otras malas y es un autentico lio.

Entonces la verdad no se como afrontar este problema, supongo que el programa debería de alguna manera discriminar las SDs que tuvieran un tamaño inferior a la imagen de grabación y además a la hora de grabar avisarte de las unidades que no se pueden grabar por no tener tamaño suficiente la unidad, pero el resto que si tienen el tamaño correcto SI deberían de grabarse,

Supongo que en el código del programa no se contempla esto y en las pruebas que he realizado yo, al mezclar SDs de diferentes tamaños a la de la imagen de grabación, lo que ocurre es que aparentemente se están grabando todas las SDs y me aparecen las barras de progreso con normalidad, pero al finalizar la grabación y ver el contenido, justo las SD que no tenían espacio suficiente no se han grabado y están en blanco, el resto si se graban.

En cambio si solo grabo 1 SD que tiene tamaño inferior a la imagen me sale este error:

Ha habido error en la grabación en E: 13/08/2017 17:19:54,33

Y se cierra la grabación.

Ya me darás alguna pista de como atajar el problema, de momento me voy apañando y salvando este problema, por lo demás el programa va de lujo y me ha quitado muchísimo trabajo de encima.

1 respuesta

Respuesta
1

No debería haber diferencia, en cuanto al tratamiento de ese problema, entre una grabación única y otra múltiple, porque al final se utiliza el mismo bat de grabación (CLDIW_C.BAT). De hecho el mensaje de error que citas lo emite ese BAT. ¿Con qué opción del menú haces la grabación de una sola SD cuando da ese mensaje de error y con que opción la grabación múltiple? Yo creo que como la ventana de control se cierra cuando la grabación da error estás pensando que se está haciendo esa grabación basándote en la ventana de control de otra grabación que sí que está funcionando. En la ventana genérica debería estar el mensaje de error pero puede que te pase desapercibido. Comprueba todas estas cosas y me dices. Y creo que no estaría de más que estudiaras estadísticamente el tamaño mínimos de las SDs para trabajar con una imagen que se ajuste a ese mínimo y evitarte el engorro de corregir individualmente las que fallen.

Y me alegro muchísimo de que te esté ahorrando ese tipo de trabajo sin gracia que estaba ahí.

Perdona, tienes toda la razón, he realizado pruebas colocando 2 SD con el espacio adecuado y 1 con menos espacio que la imagen, y lo que ocurre es que se cierra la ventana de grabación automáticamente al detectarse que la unidad G en este caso tiene menor espacio, el resto parece grabarse con normalidad. Suelo usar la opción 2 para las grabaciones, y si tengo 2 imágenes distintas para grabar uso la opción 1 y 2.

Lo que comentas de buscar la SD con el menor tamaño debería ser la solución, el problema es que muchas veces tengo que estar viendo el espacio que tienen las SD y tengo que probar muchas, y siempre termina apareciendo alguna aun más pequeña, para que te hagas una idea, el tamaño más pequeño que me suelo encontrar es de 15.126.528 KB (luego el tamaño en disco siempre es algo mayor) y las más grander rondan casi los 16 GB: 15.982.. 528 KB.

Se me ocurren algunas soluciones, lo primero que pondría en el programa es un mensaje avisando de que se cierra la unidad equis por no tener el tamaño suficiente, así sabré que el motivo es por tamaño y no por defecto de la SD.

Por otro lado yo intentaré buscar siempre la SD más pequeña y hacer con ella la imagen base, el problema que muchas veces acaba usando esa SD por lo que tendría que buscar otra, por lo que me vendría bien de alguna forma implementar un código en el programa que me listase las unidades de SD que tengo insertadas indicándome sus tamaños, de esta forma podría saber de manera más rápida el tamaño de varias SD de un tirón, y ya si el programa me indicase de ese grupo que SD es la menor seria ya la leche, pero bueno ya sería un avance realizar bien la primera parte.

Por mi parte eso es todo. Un saludo!

Para habilitar un mensaje específico dependemos de lo que devuelva el CLDI. Si cuando se produce un error por tamaño lo indica con algún valor concreto de la variable de entorno ERRORLEVEL se podrá hacer y si no tiene un valor especial para esa circunstancia no habría nada que hacer. A ver si eres capaz de detectarlo tú mismo. Te sugiero que crees una versión ligeramente modificada del bat CLDIW_C (guarda la actual en otra carpeta o cámbiale de nombre). La nueva versión sería algo así:

@echo off
Setlocal EnableDelayedExpansion
title=cldiw_%1
set carpCLDI=c:\tmp\ggg
if exist menusd.ini call :config
if #%1#==## goto :sinDisco
if not exist %2 goto :sinImagen
start "Control grabacion unidad %1" GrabCont %1
"%carpCLDI%\CommandLineDiskImager.exe" %2 %1 > Grab%1.log
if errorlevel 5 echo.&echo Error 5 en la grabacion en %1: %date% %time%&goto :fin
if errorlevel 4 echo.&echo Error 4 en la grabacion en %1: %date% %time%&goto :fin
if errorlevel 3 echo.&echo Error 3 en la grabacion en %1: %date% %time%&goto :fin
if errorlevel 2 echo.&echo Error 2 en la grabacion en %1: %date% %time%&goto :fin
if errorlevel 1 echo.&echo Ha habido error en la grabacion en %1: %date% %time%&goto :fin
if errorlevel 0 echo.&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
: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
set /a npar+=1
)
goto :eof

Esta versión pretende abrir un poco el posible abanico de errores devueltos por el CLDI. Las peculiaridades de funcionamiento del IF ERRORLEVEL obligan a que el orden de las consultas sea de mayor a menor. Si en algún caso "cayera" en el Error 5 habría que habilitar explícitamente valores mayores para averiguar que valores se están dando porque que se dé IF ERRORLEVEL 5 solo significa que se ha devuelto un valor de ERRORLEVEL superior o igual a 5. Bueno, incluyes esta versión del BAT modificado y haces un intento de grabación de una imagen de mayor tamaño y tomas nota del valor  que saca para el Error. Si es mayor que 1 ha habido suerte. Si sale el mensaje del valor 1 (el que ya conoces) habrá que olvidarlo.

En cuanto a crear un bat (tu hablas de habilitar una opción del programa pero a mí me parece más razonable crear un bat distinto, al menos en principio, si luego decides integrarlo en el MENU...) que te indique simplemente el tamaño de las unidades SD insertadas y cuál es la más pequeña no creo que haya mucho problema (no me atrevo a asegurarlo porque el MSDOS puede tener problemas para tratar números muy grandes, pero algún truco habría). Voy a ponerme con ello y te haré una propuesta. Tú, mientras, intenta hacer lo que te he sugerido y me cuentas.

Este sería un primer intento para examinar los tamaños de las SDs y encontrar el mínimo:

@echo off
Setlocal EnableDelayedExpansion
> dskprttmp.txt echo list volume
set /a min=10000000
for /f "skip=8 tokens=3,6,7,8,9*" %%a in ('diskpart /s dskprttmp.txt') do (
if %%b==Extra¡ble (
   set /a tam=%%c
   if %%d==GB set /a tam=!tam!*1000
   echo Unidad: %%a Tama¤o: %%c %%d
   if !tam! lss !min! set min=!tam!
   )
)
if !min! lss 10000000 if !min! geq 10000 echo Tama¤o m¡nimo: !min!/1000 GB&goto :eof
if !min! lss 10000000 if !min! lss 10000 echo Tama¤o m¡nimo: !min! MB

He realizado la grabación con el nuevo código que me has pasado y me muestra el siguiente mensaje:

Ha habido error en la grabación en H: 14/08/2017 15:58:48,88

Por lo que he de suponer que es el Error level nº1 y no nos sirve, pero revisando el archivo GrabH.log que se genera en la grabación he descubierto el siguiente mensaje:

writing file D:\Imagenes SD\VIC to device H:
error - not enough space

El cual especifica que el error se debe a espacio insuficiente, no se si esto puede servir para algo.

De momento es todo lo que he podido investigar.

Creo que eso indica que el CLDI no tiene el detalle de trasladar al ERRORLEVEL los diferentes errores que detecta el programa, solo utiliza los valores 1 si hay error y 0 si no lo hay. Podemos complicar un poco el tratamiento del errorlevel 1 obligándole a revisar el log y explicitar los errores. Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
title=cldiw_%1
set carpCLDI=c:\tmp\ggg
if exist menusd.ini call :config
if #%1#==## goto :sinDisco
if not exist %2 goto :sinImagen
start "Control grabacion unidad %1" GrabCont %1
"%carpCLDI%\CommandLineDiskImager.exe" %2 %1 > Grab%1.log
if errorlevel 1 (
echo.
echo Ha habido error(es) en la grabacion en %1: %date% %time%
for /f "tokens=*" %%a in ('type Grab%1.log^| find "error"') do echo %%a
goto :fin
)
if errorlevel 0 echo.&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
: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
set /a npar+=1
)
goto :eof

He probado el ultimo código copiándolo el cldiw_c y cuando intento grabar una SD con un tamaño menor me sale el siguiente error:

Por lo que supongo que no ha funcionado.

Por cierto, ¿dónde tengo que colocar el código que me pasaste para saber el tamaño de las SD? Lo he metido en un .bat independiente y al ejecutarlo no funciona.

Más que que no haya funcionado yo me preguntaría si no ha habido algún error al copiar algo. Comprueba si en el GrabE.log sigue apareciendo el error que me dijiste. Intuyo que no porque me da la impresión de que no ha llegado a lanzarse el CLDI. Por cierto, ¿por qué en el "caption" de la ventana grande dice "Administrador:=cldiw_E"?

En cuanto al código que te pasé para el tamaño de las SDs es, efectivamente, para un bat independiente. Hay que ejecutarlo como administrador. Te sugiero que pruebes a lanzarlo desde una ventana CMD, hagas un TYPE del bat, lo ejecutes y me pases lo que se vea en la ventana.

Ya sabes que hace falta paciencia para estas cosas.

Lo del "caption" ya está claro, es el efecto del comando title del bat cldiw_c.

Y también he podido aclarar las razones de que no te funcionara el bat para el tamaño de las SDs. Yo lo había probado con pendrives, todos ellos con nombre. Tus SDs no deben tenerlo de modo que las variables no están bien asignadas. Prueba con este:

@echo off
Setlocal EnableDelayedExpansion
> dskprttmp.txt echo list volume
set /a min=10000000
for /f "skip=8 tokens=3,5,6,7,8,9*" %%a in ('diskpart /s dskprttmp.txt') do (
if %%b==Extra¡ble (
   set /a tam=%%c
   if %%d==GB set /a tam=!tam!*1000
   echo Unidad: %%a Tama¤o: %%c %%d
   if !tam! lss !min! set min=!tam!
   )
)
if !min! lss 10000000 if !min! geq 10000 echo Tama¤o m¡nimo: !min!/1000 GB&goto :eof
if !min! lss 10000000 if !min! lss 10000 echo Tama¤o m¡nimo: !min! MB

He vuelto a grabar la SD que da error de tamaño con el ultimo código que me pasaste y he borrado todos los .log para ver de nuevo lo que se genera, y al intentar grabarse me aparecen 3 mensajes de error:

- En el GrabE.log aparece lo mismo de antes:

writing file D:\Imagenes SD\VIC to device E:
error - not enough space

- en el logtmpH.log me pone 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

-Y en la barra de progreso me aparece este mensaje:

No se esperaba 1==/ en este momento.

Por lo que seguimos en el mismo punto, en cuanto al script para saber los tamaños de las SDs sigue sin irme, no se que hago mal, quizás tenga que ubicarme en alguna carpeta o algo, al ejecutar el ultimo código que me pasas como admin sale una ventana en msdos en negro durante 10 seg y se cierra, y si lo ejecuto sin admin me aparece durante una fracción una lista de unidades pero no meda tiempo a ver que pone.

Saludos.

Vamos a ver:

Respecto a la presentación de los errores del log en la ventana principal:

  1. Olvídate de la ventanita de progreso y del mensaje "No se esperaba 1==/ en este momento." Es normal porque la invocación al Powershell necesita que el log correspondiente (en este caso el GrabE.log) tenga datos de grabación, y no es el caso. Cuando se acabe el proceso correctamente se cerrará esta ventana y no nos importa lo que haya dicho.
  2. Me preocupa el mensaje de la ventana principal "No se esperaba en en este momento". Si sigue saliendo hay que encontrar la causa.
  3. Imagino que sigue sin salir en la ventana principal el mensaje de error: "error - not enough space". Esto debe estar relacionado con el punto 2. Necesito un TYPE del CLDIW_C.BAT que estás usando, porque creo que debe tener algún error de copia que explique las dos cosas.
  4. Hablas del logtmpH.log y debería ser logtmpE.log. Si es simplemente un error tuyo no tiene mayor importancia porque el contenido del que hablas es el esperado para este último.

Respecto al bat para detectar los tamaños de las SDs intuyo que no me has hecho mucho caso en lo de lanzarlo desde una ventana CMD. Supongo que sabes lo que es, pero si no es así me lo dices y te lo cuento. Pero para salir del paso incluye el comando PAUSE como última instrucción del BAT y ejecútalo como administrador. Así podrás ver lo que ha salido. Y me lo cuentas.

He ejecutado la ventana de CMD comoadmin y me he ubicado en la ruta donde tengo el archivo .bat, luego lo he ejecutado con el comando START, y se me abre otra ventana en la que aparece la ruta en la que estoy y el cursor parpadeando y no sucede nada más. Lo que no entendí que hacer con el comando TYPE que me comentastes, ese comando según se es para ver el contenido interno de un archivo txt.

En cuanto a lo de la grabación, he vuelto a realizar grabaciones de prueba, he metido una SD en la unidad I y he probado a grabarla con una imagen de tamaño adecuado y se graba con normalidad sin ningún tipo de mensaje de error, en cuanto hago esa misma grabación pero usando una imagen de tamaño superior a la de la SD me sale el mensaje que ya conocemos: en la ventana principal aparece "no se esperaba en este momento" y en el GrabI.log aparece el mensaje de espacio insuficiente.

Te paso por aqui el contenido de mi cldiw por si detectas algun error de copia:

@echo off
Setlocal EnableDelayedExpansion
title=cldiw_%1
set carpCLDI=c:\tmp\ggg
if exist menusd.ini call :config
if #%1#==## goto :sinDisco
if not exist %2 goto :sinImagen
start "Control grabacion unidad %1" GrabCont %1
"%carpCLDI%\CommandLineDiskImager.exe" %2 %1 > Grab%1.log
if errorlevel 1 (
echo.
echo Ha habido error(es) en la grabacion en %1: %date% %time%
for /f "tokens=*" %%a in ('type Grab%1.log^| find "error"') do echo %%a
goto :fin
)
if errorlevel 0 echo.&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
: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
set /a npar+=1
)
goto :eof

y lo que comentabas de la unidad en el mensaje anterior fue un error mio, como siempre hago grabaciones en diferentes unidades pues te copie el error de otra unidad, pero vamos es lo mismo, el error es igual independientemente de la unidad usada.

Respecto a lo primero, no debes ejecutarlo con START sino simplemente tecleando el nombre que le hayas dado al BAT. Si lo haces con START abre otra ventana y la cierra al terminar, por lo que no ves lo que haya escrito (a no ser que el bat incluya un PAUSE al final).

Y respecto a lo otro he hecho pruebas (hasta ahora no estaba en una situación que me permitiera hacerlas y, además, pensaba que no eran necesarias, pecado de inmodestia) y ya he visto que el IF con ERRORLEVEL es peculiar y no permite más que una línea de instrucciones. Es decir que el tratamiento hay que hacerlo aparte. Además en el caso de que haya error inmediato se mata la tarea de control de progreso antes de que exista y por ello no se cierra la ventana de control, hay que esperar un poco. Prueba con esta versión del CLDIW_C.BAT:

@echo off
Setlocal EnableDelayedExpansion
title=cldiw_%1
set carpCLDI=c:\tmp\ggg
if exist menusd.ini call :config
if #%1#==## goto :sinDisco
if not exist %2 goto :sinImagen
start "Control grabacion unidad %1" GrabCont %1
"%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 Ha habido error(es) en la grabacion en %1: %date% %time%
for /f "tokens=*" %%a in ('type Grab%1.log^| find "error"') do echo %%a
ping -n 5 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
set /a npar+=1
)
goto :eof

Acabo de ver ahora (las 18:10) que no te había enviado este mensaje, cuando creía que lo había hecho a las 13:30.

Estoy probando lo de las SD, y ahora ejecutandolo directamente parece que va pero no consigo que se pare cuando me lista los discos, he probado a poner PAUSE al final y en medio y nada siempre se cierra la ventana, lo más que he conseguido que me lance un mensaje tipo "no se esperaba pause en este momento"

Lo otro parece que ya funciona, me dice en la ventana principal  "error - not enough space"

He probado a grabar una SD con espacio mayor y otra con menor, la menor lanza el error en la ventana principal y la otra si se graba, supongo que se podrá modificar ese mensaje de la ventana principal por otro.

Lo de cambiar los mensajes te lo dejo a ti, entre otras cosas porque me parece una complicación innecesaria (no estoy a favor del inglés, pero son los mensajes de error que saca el CLDI y para ser coherente habría que conocer todo el abanico de posibles mensajes de error, detectarlos y traducirlos). Si quieres ponerte con ello tendrás que tratar el FOR /F que hemos incorporado al CLDIW_C.BAT para revisar el texto del error y en lugar de sacarlo tal cual (echo %%a) sacar el texto que te parezca.

En cuanto a lo del otro bat no puedo entender lo que me dices. Te voy a poner un ejemplo completo de lo que me sale a mí (con una sola SD, lo siento):

Primero hago un TYPE del bat (amra.bat, le he llamado) para que contrastes su contenido. Esto es lo que alguna vez te he pedido que hagas porque no siempre se ven igual con TYPE o con el Bloc de notas, por poner un ejemplo.

Luego ejecuto el amra.bat sin más que escribir su nombre "amra" y ahí sale la unidad G con su tamaño (esta SD es de 4 GB). Como solo hay una el mínimo es el mismo, claro, pero puedes ver que hasta que no cierres la ventana CMD lo tienes ahí. Si quieres poner un PAUSE lo pones como última instrucción del bat. Quedaría así:

@echo off
Setlocal EnableDelayedExpansion
> dskprttmp.txt echo list volume
set /a min=10000000
for /f "skip=8 tokens=3,5,6,7,8,9*" %%a in ('diskpart /s dskprttmp.txt') do (
if %%b==Extra¡ble (
   set /a tam=%%c
   if %%d==GB set /a tam=!tam!*1000
   echo Unidad: %%a Tama¤o: %%c %%d
   if !tam! lss !min! set min=!tam!
   )
)
if !min! lss 10000000 if !min! geq 10000 echo Tama¤o m¡nimo: !min!/1000 GB&goto :eof
if !min! lss 10000000 if !min! lss 10000 echo Tama¤o m¡nimo: !min! MB
Pause

Y en este caso puedes ejecutarlo directamente desde el explorador, siempre como administrador, y saldrá lo siguiente:

La misma información que desaparecerá cuando presiones una tecla y se cierre la ventana.

Si no tienes más asuntos creo que podemos darlo por cerrado.

He decidido hacerte un regalo, un poco envenenado, eso sí, por si quieres detectar y traducir los posibles errores del CLDI. Echándole un vistazo al ejecutable con un editor hexadecimal (en concreto el UltraEdit) he localizado, creo, la lista de posibles errores y te la paso aquÍ:

Error - file not found 
Error - device not found 
error - invalid handle value for volume    
error - can't get a lock on volume 
error - can't unmount volume   
error - invalid handle value for file  
error - invalid handle value for disk 
error - not enough space 
error - data is null 
error - error whilst writing 
error - no image file specified    
error - not able to get handle on image file   
error - not able to get handle on device   
error - not able to get handle on volume    
error - not able to lock volume    
error - not able to unlock volume  
error - not able to dismount volume    
error - not able to read data from handle  
error - not able to write data from handle 
error - not able to get number of sectors  
error - not able to get image file size    
error - not able to get device number, is something accessing the device?  
Error - not able to get device properties, ¿is something accessing the device?

Haber, lo mismo estoy cometiendo el error más principiante de esta página, pero estoy casi seguro de hacer tus mismo pasos y no soy capaz de ver la ventana mostrándome los tamaños de unidad, no importa cuantos pauses meta, siempre se cierra. Te pongo los pasos al detalle que realizo, he usado el ultimo código que me has pasado con un pause al final.

1-Abro CMD ejecutándolo como administrados

2-Me posiciono en la carpeta que tengo en el escritorio desde CMD

3-Mi archivo se llama tamaño.bat, le hago primero un "type tamaño.bat" y me aparece lo de la imagen:

4- Ahora pongo "tamaño" sin más y lo que sucede es que se abre otra ventana y durante una milésima de segundo muestra algo que nunca alcanzo a ver, da igual los pause que ponga, he llegado a llenar el código de pause y lo que ocurre es que muestra la información durante una milésima y luego me aparece lo del pause "pulse una tecla para continuar" a si que para ver lo que ponía he tenido que recurrir a la pilleria y a estar 10 minutos ejecutando el puñetero .bat y pulsando la tecla imprimir pant, al final ha ganado mi paciencia y he conseguido pillar esta imagen de la ventana "fugandose"

En cuanto a lo del mensaje en ingles no tiene mayor importancia, se lo justo de ingles para saber que significan la lista de errores que me mandas, por lo que por mi parte ese tema esta resuelto.

Creo que lo que falla es lo de abrir el CMD como administrador. Como soy de la vieja escuela nunca puedo vivir sin tener un icono del CMD en el escritorio, de manera que abrirlo como administrador solo me supone pinchar sobre el icono con el botón derecho del ratón y elegir "Ejecutar como administrador", pero en este caso en el "caption" de la ventana pone algo como "Administrador: cmd". En tu captura de pantalla pone "Símbolo del sistema" y eso indica, creo, que pese a lo que creas no se ha abierto como administrador. De modo que vamos a centrarnos en la forma de abrir el CMD como administrador (de paso deduzco que no has probado a ejecutar el TAMAÑO.BAT desde el Explorador de Windows, luego lo vemos). En Windows10, sin icono para CMD en el escritorio, la forma de abrir el "Símbolo del sistema" como administrador parece ser la siguiente (nunca lo había hecho hasta ahora):

  1. Pinchar con el botón izquierdo la ventanita de Windows, normalmente situada en la parte inferior izquierda.
  2. Situarse en la "S", desplegar "Sistema de Windows" y elegir, con el botón derecho, "Símbolo del sistema" -> "Más" -> "Ejecutar como administrador"
  3. Saldrá un ventana emergente de Windows pidiendo permiso para hacer cambios. Pulsar "Sí" para permitirlos.
  4. Ahora se abrirá una ventana de CMD con título/caption "Administrador: Símbolo del sistema"
  5. Ahora navegas por tu estructura de directorios hasta encontrar la carpeta donde has dejado el TAMAÑO.BAT, haces un TYPE del archivo para ver como lo tienes (lo digo por lo de los PAUSE que hayas podido dejar), y una vez comprobado que está como se espera tecleas TAMAÑO y ya debe ir "como una rosa".

Volviendo a lo que anunciaba con el "luego lo vemos" no sé si probaste a ejecutar desde el Explorador de Windows la versión del TAMAÑO.BAT que aparece en el TYPE de la captura de más arriba (es decir, con un único PAUSE al final). Si lo hubieras hecho debería haberte salido lo que aparecía en mi segunda captura, la que tiene como título/caption "C:\WINDOWS\System32\cmd.exe" y eso independientemente del otro procedimiento. Por si acaso, y creo que aquí ya me paso de prudente, te diré que desde el explorador de Windows (icono de carpeta con soporte, jua, jua) te sitúas sobre el archivo TAMAÑO.BAT con el botón derecho del ratón y eliges "Ejecutar como administrador", contestas "Sí" a la ventana de "Control de cuentas de usuario" y ya debe salir la ejecución con los datos y el mensaje "Presione una tecla para continuar".

Por último, por si te interesa, te diré como crear un icono para CMD/Símbolo del sistema en el Escritorio. Aunque, ahora que lo pienso, a lo mejor ni siquiera usas el Escritorio, porque desde Windows 8 creo que hay otra forma de trabajar que ni siquiera conozco. Si usas Escritorio, con el Explorador de Windows, te sitúas sobre C:\WINDOWS\System32\cmd.exe, lo pinchas con el botón derecho y eliges Enviar a/Escritorio (crear acceso directo).

Bueno. Espero que con esto se aclare de verdad el asunto.

Y no seas rata y traduce los mensajes de error ;-)

Me he tomado la paciencia y el tiempo de hacer cada uno de los puntos que me has comentado y sigo en las mismas, la ventana con la información de los discos desaparece en una centésima, he probado a crear otro bat con ese mismo código, lo he colocado en otra ubicación y me ocurre lo mismo, por supuesto he probado de todas las formas ejecutando el cmd como admin, me he creado acceso directo en el escritorio de cmd y le he dado permisos de admin haciendo clic en las propiedades del acceso directo, también he probado a hacer clic directamente al .bat y darle a "ejecutar como administrador" por lo que creo que el problema no debe de estar en lo de admin, puede ser que sea problema del tratamiento de ese codigo por parte de windows10 y que no funcione por algún motivo.

Luego si pongo en funcionamiento otro equipo que tengo con windows 7 probare en el, de momento me doy por satisfecho ya que es un problema menor, por lo que por mi parte todo perfecto y muchas gracias por tu ayuda, he aprendido muchas cosas que desconocía. 

Si algun dia de estos tengo un rato y me veo inspirado probare a traducir los mensajes de error, no tiene que ser dificil hacer ese cambio.

No puedo entenderlo, yo también estoy probando con Windows10. La ventana de cmd como administrador, ¿te sale con título "Administrador: Símbolo del sistema"? ¿Se crea el archivo temporal dskprttmp.txt?

¿Quieres qué me conecte por Teamviewer a ver si se me ocurre algo?

Pues el archivo temporal que comentas si que me sale, pero parece que lo de administrador en la barra de tareas no, si estas ahora disponible te paso teamviewer y echa un vistazo si quieres.

Saludos.

Vale. Podemos intentarlo.

236 818 982

x336zd

yo uso la version 11, si tienes la 12 no te valdrá

Espera un poco que la versión que tengo en el portátil de mi hijo es muy antigua y además me dice no se qué de que han detectado un uso comercial.

Ya estoy en casa. Con lo que hemos visto queda claro que el problema no era, al final, la ejecución del CMD en modo administrador sino la salida del "list volume" del comando DISKPART en tu entorno. No me quedó claro si la forma de presentar el tamaño para las SDs que usas daba problemas. Creo que el bat no trataba bien los tamaños en GB. Confírmamelo para que estudie un poco más el asunto y, sobre todo, dime si te puede servir aunque el DISKPART maneje tamaños en "formato Linux" como me pareció entender. A la hora de averiguar cual es el mínimo no debería importar puesto que te indica la unidad. Mi hijo ha tenido trillizos y ando de acá para allá pare echarles una mano. Y en su casa, con su portátil, me apaño peor que en la mía.

Bueno.

Pues el bat no trata bien el tamaño de las unidades, me muestra los tamaños de la SD en GB por lo que no puedo saber cual es la más pequeña ya que muchas veces la diferencia son unos pocos Kylobytes, por otro lado no se si se podría mostrar el tamaño real de la SD independientemente del formato maestro MRB que haya adquirido, es este caso linux, por que no se podría hacer una comparación real entre una SD en blanco con una grabada con el MRB de linux, en el primer caso mostraría 16GB y en el segundo 60 Mb de espacio total, windows no reconoce a priori más espacio en ese formato.

No se si esto será posible, si no lo fuera, habría que tratar las SD grabadas en linux de otra forma, o probar haber si también existe alguna diferencia entre una SD de menor tamaño y otra de mayor tamaño grabada en linux y así dar tratamiento para este caso.

Desde luego si tu hijo ha tenido trillizos entiendo que estés ocupado, felicidades!

No voy a entrar en el fondo de la cuestión. Tú deberías decidir si el tamaño que ofrece el comando list volume de la herramienta DISKPART se adapta a tus necesidades (incluyendo la capacidad de diferenciar dos SDs de tamaños muy parecidos) o si habría que recurrir a algún otro comando o herramienta (por ejemplo el comando DIR del MSDOS) o si Windows no ofrece ninguna posibilidad de hacer lo que quieres. A partir de esa decisión ya se podría empezar a programar el BAT que se adaptase a tus necesidades o abandonar el intento.

Si la diferenciación que realiza el comando list volume es de la forma en la que lo muestra actualmente pues la verdad no me sirve, te he descrito mi caso con las SD y el sistema de archivos de linux por si eso te daba alguna pista a la hora de elegir el comando mas apropiado para el tratamiento del mismo, ya que yo no tengo ni idea de como hacerlo, si esos datos para ti son irrelevantes pues perfecto, prueba a tratar de la misma forma todas las SD, realmente no me importa como me muestre los datos el programa, lo más importante que yo de alguna manera pueda saber que SD es la que contiene menor espacio, si para simplificar todo, tengo que formatear previameente las SD que tienen formato linux como hice ayer, no me importa, así todas las SD estaran en igualdad de condiciones para su tratamiento, pero repito, me interesa saber cual o cuales serian las SD mas pequeñas de todas las que tengo insertadas en mi equipo, no me importa en que unidad de medida me lo muestre.

Lo que quiero decir es que tú puedes hacer las pruebas que consideres oportunas para ver como sale en Windows la información relacionada con el tamaño de las SD, formateadas, vírgenes, o como te convenga. En concreto puedes ver como funcionan los comandos de DISKPART y si tienen opciones que permitan obtener una información más adecuada. A partir de esas pruebas ya se supone que tendrás capacidad para decidir que herramientas o comandos de Windows te aportan la información adecuada y, una vez tomada la decisión, tal vez pueda ayudarte a construir el bat. Pero ese trabajo previo yo no podría hacerlo, ni aunque quisiera, porque no tengo el entorno adecuado.

Vale de acuerdo, es que no sabia como empezar a tratar el problema, buscare información acerca de ese comando u otros que me puedas servir para saber si hay alguna herramienta que me permita hacer la apreciación de tamaño que necesito. Si obtengo algo de interés te comentaré.

Saludos.

De acuerdo. Quedamos en eso. Pero no puedo evitar la tentación de pasarte la versión en la que estaba trabajando (sobre DISKPART, claro). Es esta:

@echo off
Setlocal EnableDelayedExpansion
> dskprttmp.txt echo list volume
set cadBusc=Extra¡ble
set /a min=10000000
for /f "tokens=*" %%a in ('diskpart /s dskprttmp.txt ^| find "%cadBusc%"') do call :tratar %%a
if %min% lss 10000000 if %min% geq 10000 (set /a min=%min%/1000&echo Tama¤o m¡nimo: !min! GB&goto :eof)
if %min% lss 10000000 if %min% lss 10000 echo Tama¤o m¡nimo: %min% MB
goto :eof
:tratar
set unidad=%3
:sig
if not "%1"=="%cadBusc%" shift&goto :sig
set /a tam=%2
if %3==GB set /a tam=%tam%*1000
echo Unidad: %unidad% Tama¤o: %2 %3
if %tam% lss %min% set min=%tam%
goto :eof

he descubierto algo que no se si puede servir de ayuda:

Si ejecutas el comando diskpart y luego seleccionas una unidad SD mediante el comando volume por ejemplo

"select volume 3"

luego ejecutas el comando "detail partition"

y aparece un dato que pareceser el tamaño en bytes de la SD justo donde pone desplazamiento de bits, eso es lo que he podido ver de momento en mis pruebas.

Ese es el tipo de investigación que creo que debes hacer. Si consigues trazar el camino para encontrarla luego ya nos encargaremos de acoplarlo a un bat. Aunque la shell tradicional de Windows (conocida como MSDOS) es mucho menos potente que cualquiera de las de Linux/UNIX, según dicen (yo he trabajado algo con UNIX y algo menos con Linux y creo que tienen razón pero mi conocimiento de esos sistemas operativos no es lo suficientemente profundo como para que haya que creerme a mí), todavía da mucho juego. La nueva shell (Powershell) me parece que ya es otra cosa, pero tampoco puedo garantizarlo. He intentado aplicar lo que me acabas de decir a mi única SD de 4 GB y el "detail partition" solo me saca el mismo dato de tamaño que sale en el "list volume" de modo que tendrías que enseñarme un pantallazo. ¿Estás hablando de SDs formateadas en Linux y vistas con el DISKPART?

En todo caso, insisto, traza el camino que habría que recorrer para conseguir la información que te interesa y ya veremos como lo integramos en un BAT.

Y ahora le quitaré el veneno al regalito envenenado de más arriba. Esta sería mi versión del CLDIW_C.BAT con los mensajes de error traducidos según mi criterio:

@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
"%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 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

Incluye un nuevo parámetro en el menusd.ini. Quedaría algo así:

00 Inicio Datos Ventana Control=15
01 Inicio Datos CommandLine=22
02 Carpeta Base=C:\tmp\ggg
03 Carpeta ImageWriter=C:\Program Files (x86)\ImageWriter
04 Carpeta Grabación=c:\tmp\Nueva carpeta
05 Nombre Imagen=Image
06 Ubicación Primaria Imagen=c:\tmp\Nueva carpeta\image8GB.img
07 Ubicación Secundaria Imagen=D:\Imagenes SD\HE
08 Unidades Primarias=G, H
09 Unidades Secundarias=K
10 Unidad Personalizada=G
11 Unidad a Reparar=2
12 Tipo unidad a reparar=2
13 Letra Unidad a reparar=N
14 Espacios=12
15 Líneas Ventana Control=4
16 Columnas Ventana Control=40
17 Número pings inicial para obtención bloques totales=1
18 Número pings de espera a primera lectura=10
19 Número pings bucle espera siguiente lectura=10
20 Número de últimos caracteres a leer=50
21 Porcentaje máximo antes de salir=98
22 Carpeta CommandLine=c:\tmp\CommandLineDiskImager
23 Número de pings de espera si hay error=5

Mantén los antiguos a buen recaudo por si no te funciona.

Muchas gracias por ese gran avance, esta tarde cuando salga de trabajar lo pruebo, te mando ahora una curiosidad, fíjate cuando el win32 me manda el error de que no hay espacio disponible:

Me señala el tamaño de la imagen y me muestra el que tiene disponible la SD, que es menor claro.

No se si este tipo de información la maneja el command line ya que esta basado en el mismo código.

Saludos!

Como ya has visto el CLIW saca exclusivamente lo que se refleja en los log. No me cabe duda de que tiene acceso a la misma información que el Win32_IW pero si no la muestra no se puede hacer nada.

Funciona perfectamente la traducción de los mensajes!

Ya me suponía que si no se manejaba esa información por parte del log no habría nada que hacer..

En lo otro seguimos donde quedamos. Si consigues concretar una serie de comandos del diskpart (o de cualquier otra herramienta) que sirva para tu propósito mejor que lo que ya tenemos me lo dices y vemos si se puede integrar en un bat (que seguro que sí). En todo caso me gustaría ver el pantallazo con la información que comentabas del "detail partition".

Ok seguiré investigando haber si encuentro algún comando útil.

Aquí el pantallazo:

Al final resulta que, contra lo que creía (y no sé de dónde lo saqué), el comando "detail partition" me saca una información muy similar a la que me has pasado. El tipo, en mi caso, es 0B y el desplazamiento es el mismo. Y no sé que significa ese desplazamiento. Si consigues averiguar algo y te parece interesante me lo dices y vemos que se puede hacer. Mientras tanto ya me dirás si te sirve o no para algo el BAT que he creado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas