Alternativa en Batch para copiar imágenes de disco SD/USB

Ya que el código de Command Line no contempla la copia de imágenes, estuve haciendo pruebas y una de las cosas que hice fue ejecutar el siguiente código:

@ECHO OFF
START "" "C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe"

De esta forma se abre la ventana del Win32DiskImager, le doy a la ruta donde quiero que me copie la imagen y le doy a "read"

Pues mi idea es colocar esta opción en el menu del batch, por ejemplo seria la opción "Clonar SD" y al entrar en esta opción y después de la clonación que el programa en batch sepa donde he guardado esa copia de imagen para posteriormente realizar la tarea de grabación en diferentes unidades que es el programa que ya tenemos acabado.

Respuesta
2

Pero no veo como el batch puede saber dónde ha dejado el W32DI la imagen si no es un parámetro que se pueda pasar al W32DI. ¿O no te estoy entendiendo?

Tienes razón, he planteado mal la solucion a lo que necesito, quizás lo que deberia de hacer es por un lado clonar la imagen mediante el Win32D y establecer desde ese mismo programa la ruta donde se guardará y posteriormente cuando quiera realizar las grabaciones, que haya una opción en el menu del batch que me permita establecer donde se encuentra la imagen que quiero grabar y que esto se guarde en una variable para su posterior tratamiento, esto es posible? de ser posible se me ocurre una buena idea con este método, pero antes de complicarlo mejor saber si es viable.

Gracias y un saludo.

Si añades algo a la invocación lo escribe en el destino, pero no hay garantía de que no se haya cambiado al terminar de usar el programa.

Por ejemplo si pones:

@echo off
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "C:\Carpeta de prueba\ImagenSD"

abrirá la ventana del W32DI y rellenará C:\Carpeta de prueba\ImagenSD en la casilla del origen/destino.

En cuanto a poder rellenar una variable interna de un bat con un path escrito manualmente no debe de haber problema.

La opción esa que me has planteado en el script me parece genial, he probado y al darle a "read" me comienza a clonar la SD, la cosa es crear desde el batch una carpeta previamente para que después me deje realizar la clonación con tu script, se me ocurren varias buenas soluciones que me pueden valer, dejame pensar para combinarlo con lo que te he propuesto sobre el tratamiento de una ruta en una variable y seguro que sale algo interesante.

Pues ya me contarás (y no me valores tan pronto las respuestas que me van a tener que subir el sueldo ;-))

Jajaj te tendrían que poner fijo en la página, ya hablare con los responsables... me voy de momento que la pareja me reclama ya, mañana si tengo hueco te digo algo. UN SALUDO

No sé si ya tienes el esqueleto del menú. Por si no fuera así te paso uno que he confeccionado a partir de otro que he encontrado en la red. No soy un gran "diseñador" de modo que los aspectos estéticos no creo que sean muy sobresalientes, pero podría servir de punto de partida. Tiene invocaciones recurrentes, lo que obliga a que el BAT se llame de una determinada manera (MENU.BAT) o a cambiar estas invocaciones:

:: ‚¡¢£¿µÖàé?¤¥¨­ -> Caracteres MSDOS
:: ÁéíóúÁÉÍÓÚüÜñÑ ¿¡ -> Caracteres Windows
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Menu.bat Menú para ejecución sencilla de tareas
:: (C) GGG junio 2017
:: Basado en uno de Cristóbal González Almirón 2014
::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ejecución directa de opciones del menú
IF NOT "%1"=="" GOTO subcomandos
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:inicio_menu
cls
echo.
echo -------------------------------------------
echo    Men£ Grabaci¢n SD
echo -------------------------------------------
set OPCION=1
set ELEGIDA=
:menu
set LISTASEL=
rem only for debbuging
rem echo ELEGIDA: %ELEGIDA%
rem  OPCION: %OPCION%
:::::::::::::::::::::::::::::::::::::
:: Opciones de menú
:::::::::::::::::::::::::::::::::::::
set ETIQUETA=primeraOpcion
set TEXTO=Texto de la primera opci¢n
set TECLA=0
if "%ELEGIDA%"=="" echo %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=segundaOpcion
set TEXTO=Texto de la segunda opci¢n
set TECLA=1
if "%ELEGIDA%"=="" echo %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=terceraOpcion
set TEXTO=Texto de la tercera opci¢n
set TECLA=2
if "%ELEGIDA%"=="" echo %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=cuartaOpcion
set TEXTO=Texto de la cuarta opci¢n
set TECLA=T
if "%ELEGIDA%"=="" echo %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=quintaOpcion
set TEXTO=Texto de la quinta opci¢n
set TECLA=J
if "%ELEGIDA%"=="" echo %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=sextaOpcion
set TEXTO=Texto de la sexta opci¢n
set TECLA=W
if "%ELEGIDA%"=="" echo %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
choice /C %LISTASEL% /M "Elige una opci¢n de las anteriores "
set ELEGIDA=%errorlevel%
set OPCION=1
goto menu
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos externos: se ejecutan en procesos separados
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Subcomandos
echo -------------------------------------------
Echo Men£ Grabaci¢n SD. Subcomando %1
echo -------------------------------------------
:: Ejecución del subcomando
goto %1
echo.
echo ERROR. Subcomando no reconocido %1
echo.
pause
goto fin
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:primeraOpcion
echo Aqu¡ ir¡an las acciones de la primera opci¢n
goto fin
:segundaOpcion
echo Aqu¡ ir¡an las acciones de la segunda opci¢n
goto fin
:terceraOpcion
echo Aqu¡ ir¡an las acciones de la tercera opci¢n
goto fin
:cuartaOpcion
echo Aqu¡ ir¡an las acciones de la cuarta opci¢n
goto fin
:quintaOpcion
echo Aqu¡ ir¡an las acciones de la quinta opci¢n
goto fin
:sextaOpcion
echo Aqu¡ ir¡an las acciones de la sexta opci¢n
goto fin
:fin
pause
exit

Ya me dirás.

El menu esta genial, tenia yo algo parecido pero el que me has pasado es más completo ya que contiene avisos según la opción que elijes.

Ando un poco liado por el trabajo, pero te comento un poco las opciones que puede llevar este menu y he estado pensando sobre como usar lo que hablamos de copiar imágenes y he tenido ideas interesantes pero no se si se podrán llevar a cabo en programación, pero que creo que son muy útiles ya que no hay ningún programa que las haya tenido en cuenta y mediante este hilo y los siguientes podemos demostrar lo interesante y la versatilidad que tiene trabajar con este tipo de scripts.

El menu principal seria algo así:

1-Clonar SD

2-Grabar SDs múltiples (es la parte que tenemos hecha)

3-Grabación SD personalizada

4-Dar formato

5-Parámetros de unidades

6-Salir

Bien, intentare explicarte de forma resumida cual es mi idea y como van ir todas las opciones conectadas, después profundizare en algo si no se entiende bien.

La idea es que mediante la opción 1 del menu se realizaran las copias de las distintas imágenes que posteriormente se usaran, entonces en una ventana de CMD nos podría preguntar:

¿Qué nombre desea ponerle al archivo? (Por ejemplo imagen 1)

Entonces se nos ejecutara un script similar a este que me pasaste:

@echo off
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "C:\Carpeta de prueba\Imagen1"

En el cual nos abre el programa Win32DiskImager pero nos deja ya colocada la ruta y el nombre del archivo que le colocamos, con lo cual solo habrá que darle al botón de copiar.

Si quisiéramos en otro momento crear otra imagen pues colocaríamos otro nombre distinto ante la pregunta del batch y se crearía por ejemplo imagen2

Esto te lo pongo de ejemplo así pues luego nos va abrir diferentes posibilidades a la hora de realizar la grabación.

La ruta donde se guardan las imágenes se puede colocar por defecto en la unidad C para que nadie tuviese problema a la hora de realizar la copia.

Ahora voy a explicar el punto 5 del menu ya que seria recomendable entrar en el antes de realizar grabaciones. En este punto el programa nos podría pedir las unidades que vamos a tener disponibles para grabar, por ejemplo la pregunta podría ser: ¿qué unidades desea habiliar para la grabación? Por favor escriba las unidades en mayúscula y separadas por una coma y un espacio.

Re:  E, F

En el ejemplo usare nada más esas 2 unidades, lo que significa que cuando vaya al punto 2 de las grabaciones, aunque tenga más tarjetas insertadas, solo me saldrá para grabar las unidades E y F, es una manera digamos de filtrar que unidades queremos preservar. (Esto es muy útil para evitar grabaciones accidentales en unidades no deseadas)

Ahora vamos al punto 2 y 3 del menu, básicamente llevara el mismo programa que ya se hizo, lo que pasa que tiene algunas diferencias uno con el otro.

El punto de "Grabar SDs múltiples" es básicamente lo que tenemos ya hecho, y es para grabar SD de 5 en 5 o de 10 en diez, la única condición es tener al menos una imagen y las unidades que vamos a usar predefinidas.

El punto de "Grabar SD personalizada" Lo que pretende son 2 cosas:

Por un lado realizar una grabación en una unidad determinada y por otro lado el script nos permitiría realizar varias grabaciones simultaneas con imágenes diferentes, me explico.

El programa al entrar en este punto nos preguntaría:

¿Qué imagen desea grabar? Y nos debería mostrar el nombre de las imágenes que usamos en el punto 1, recordemos que tenemos 2 (imagen1 e imagen2)

Por lo que el programa nos mostraría la imagen y un numero delante para seleccionar la opción, por ejemplo:

1-imagen 1

2-imagen 2

3-imagen ...

Una vez que seleccionamos la imagen, el programa nos preguntara

¿En qué unidad o unidades desea realizar la grabación? Escriba en mayúscula y separado por coma y espacio.

Esto es muy útil si por ejemplo quiero grabar la imagen 1 en la unidad G y E y la imagen 2 en las unidades L y J.

Habrá que ver cual es el mejor método para realizar este proceso, quizás sea mejor que el programa te ponga el nombre de las imágenes y que al lado nos deje escribir el nombre de la unidad.

Yo hasta ahora para realizar varias varias grabaciones con el Win32DiskImager tenia que tener tantas imágenes como grabaciones y unidades, es decir si la imagen ocupa 15 gigas y quiero grabar 4 SD simultaneas ocuparía en disco 60 gigas, todo esto ya queda solucionado con este programita, por eso creo en la importancia de que se use este tipo de herramientas ya que nos facilitan todo enormemente.

Ya por ultimo el punto 4 es para formatear las SD o USB desde el sistema de archivos, hay unos comandos de CMD muy útiles para esto, y que siempre me toca buscarlos porque no los recuerdo. Esto es muy utilsobre todo cuando trabajas en otros sistemas operativos como linux o mac y creas imágenes en USB, luego en windows nunca te reconocen el espacio aunque lo formatees desde la utilidad de windows, por eso creo que es necesaria esta opción.

Bueno de momento esto es todo, no te agobies aunque veas muchas cosas, es que mi tiempo a veces es limitado y he visto ahora el momento de explicártelo un poco por encima. Por supuesto si hay algo mejorable o si crees conveniente agrupar los menús de otra forma adelante, eres tu quien sabe cual es la mejor forma de afrontar muchos de estos problemas y si hay algo que no ha quedado claro sin problema te lo ampliare.

Gracias por tu atención de nuevo y un saludo!

Una primera versión (solo están programadas la opción 1 y la 6):

:: ‚¡¢£¿µÖàé?¤¥¨­ -> Caracteres MSDOS
:: ÁéíóúÁÉÍÓÚüÜñÑ ¿¡ -> Caracteres Windows
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Menu.bat Menú para ejecución sencilla de tareas
:: (C) GGG junio 2017
:: Basado en uno de Cristóbal González Almirón 2014
::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ejecución directa de opciones del menú
IF NOT "%1"=="" GOTO subcomandos
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:inicio_menu
cls
echo.
echo -------------------------------------------
echo    Men£ Grabaci¢n SD
echo -------------------------------------------
set OPCION=1
set ELEGIDA=
:menu
set LISTASEL=
rem only for debbuging
rem echo ELEGIDA: %ELEGIDA%
rem  OPCION: %OPCION%
:::::::::::::::::::::::::::::::::::::
:: Opciones de menú
:::::::::::::::::::::::::::::::::::::
set ETIQUETA=clonarSD
set TEXTO=Clonar SD
set TECLA=1
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDm
set TEXTO=Grabar SDs m£ltiples
set TECLA=2
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDp
set TEXTO=Grabaci¢n SD personalizada
set TECLA=3
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=darFormato
set TEXTO=Dar Formato
set TECLA=4
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=asignParam
set TEXTO=Par metros de unidades
set TECLA=5
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=salir
set TEXTO=Salir
set TECLA=6
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto fin
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menu.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
choice /C %LISTASEL% /M "Elija una opci¢n de las anteriores " 
set ELEGIDA=%errorlevel%
set OPCION=1
goto menu
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos externos: se ejecutan en procesos separados
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Subcomandos
echo -------------------------------------------
Echo Men£ Grabaci¢n SD. Subcomando %1
echo -------------------------------------------
:: Ejecución del subcomando
goto %1
echo.
echo ERROR. Subcomando no reconocido %1
echo.
pause
goto fin
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:clonarSD
set /p CarpGrab=¨En qu‚ carpeta desea que se guarde la imagen (path completo)? 
if exist %CarpGrab% goto nombre
echo No existe la carpeta %CarpGrab%
set /p Es_Crear=¨Quiere crearla (S/N)? 
if not %Es_Crear%==S if not %Es_Crear%==s goto :clonarSD
md %CarpGrab%
:nombre
set /p NbreImg=¨Qu‚ nombre desea ponerle al archivo? 
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "%CarpGrab%\%NbreImg%"
if exist "%CarpGrab%\%NbreImg%" echo Clonaci¢n finalizada&goto inicio_menu
echo No se ha creado el archivo. Revise el proceso y vuelva a ejecutarlo si procede
pause
goto inicio_menu
:grabarSDm
goto inicio_menu
:grabarSDp
rem echo Se va a lanzar la grabaci¢n de la imagen en %CarpGrab%\%NbreImg%_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%
pause
goto inicio_menu
:darFormato
echo Aqu¡ ir¡an las acciones de la cuarta opci¢n
goto fin
:asignParam
echo Aqu¡ ir¡an las acciones de la quinta opci¢n
goto fin
:salir
echo Aqu¡ ir¡an las acciones de la sexta opci¢n
goto fin
:Fin
Pause
rem exit

He metido una pregunta sobre la carpeta de destino de la imagen, además del nombre. Esto puede complicar las opciones 2 y 3, además de que habría que escribir más. Por otra parte el esquema original contempla tratar cada opción de menú en una nueva tarea en paralelo con el propio menú. Tiene la ventaja de que por ejemplo puedes lanzar la opción 3 varias veces, cada una con una imagen y una unidad de destino. Pero obliga a que la tarea receptora tenga que tratar los parámetros de invocación, en este caso la ubicación de la imagen y la unidad de destino. Tras la clonación compruebo si el archivo de imagen existe en la carpeta de destino de la imagen. Si no existe se interpreta que o bien el grabador a fallado o se ha cerrado prematuramente o se cambió el nombre de la imagen de forma manual antes de dar al "Read". Bueno, que hay algo de tela que cortar aquí.

He probado la primera version que me has pasado y funciona bien, quizás falta algún detalle como poner en la ventana que se esta copiando la SD y hacer algún cls para borrar de vez en cuando datos innecesarios, pero de momento todo bien.

Pienso que una buena solución para el problema que comentas es asociar un nombre de una imagen con una ruta especifica y crear para esto una variable, y siempre que se trabaje con esa variable se este haciendo referencia a la imagen localizada en una determinada ruta.

Si se desea crear otra imagen distinta pues se le predefine otra ruta y que esto quede registrado en otra variable, de esta forma se podría usar esta información para simplificar la tarea de las opciones 2 y 3, porque como bien dices, de la otra forma se complicaría mucho el programa además de tener que escribir mucho más código para contemplar las diferentes ubicaciones de un mismo archivo.

Lo que no tengo muy claro es como se registrarían en una primera instancia esos datos en el programa, quizás se pueda hacer una opción que sirva como de "alta de rutas" es decir, si yo por ejemplo voy a grabar 3 tipos de imágenes y cada una de las imágenes tiene una ruta determinada, pues en alguna opción del programa le diré el nombre de la imagen y en que ruta se tendrían que grabar, de esta manera al ir a la opción 1 de clonar el programa ya me mostraría las rutas predefinidas y solo me faltaría grabar.

De esta manera evitaríamos que cada vez que voy a clonar una imagen me pida el path, ya que se hace repetitivo, porque muchas veces la copia que voy a realizar es solo una actualización de la imagen y la ruta y el nombre no van a variar, por eso te he comentado lo de asociar rutas con nombres de imágenes, y así quizás te venga mucho mejor a la hora de programar los siguientes puntos.

Yo diría que, en el punto en el que estamos, fase de diseño, lo primero que habría que decidir es que opciones del menú deben permitir ejecuciones paralelas, concurrentes y cuáles no. Las concurrentes deben lanzarse con START, crear una nueva tarea (con ventana propia o sin ella, según convenga) y presentar de nuevo el menú y las no concurrentes se ejecutarán dentro del propio MENU.BAT. Por ejemplo la opción 2, tal como la hemos venido usando, debe lanzar una tarea de grabación para cada unidad destino, pero no parece que deba hacerse a nivel de opción de menú. Quiero decir que si se elige la opción 2 (para la que previamente se habrá usado la 5 para definir las unidades destino) no debe volverse al menú hasta que se haya completado. En cambio la opción 3 parece que debe lanzar una tarea (con su imagen a grabar y su unidad de destino propias) y volver al menú para permitir volver a usar esa opción para lanzarla de nuevo (con una imagen distinta y otra unidad de destino). A mí me da la impresión de que solo las opciones 3 y 4 deberían lanzar tareas independientes (de esta opción 4 no sé el programa o comando concreto pero intuyo que se puede lanzar el formateo de una unidad mientras se está formateando otra).

En cuanto a la carpeta de destino de las imágenes podría ser una variable interna del BAT, a retocar en el propio BAT (con un comando SET) o un parámetro de invocación (supongo que sabes que si un bat admite un parámetro de invocación que sea una carpeta se le puede pasar esa información desde Windows arrastrando la imagen de la carpeta encima del icono del BAT). También se podría habilitar una opción de menú para "clonación por defecto" para distinguirla de la "clonación con selección de nombre y carpeta". En fin, todas estas posibilidades deben barajarse ahora. Si tienes experiencia en programación sabrás que lo que no se aborda en la fase de diseño suele dar problemas para incorporarlo más adelante además de propiciar las "chapuzas". No es éste un "proyecto" de envergadura por lo que tal vez sea exagerado aplicarle las normas válidas para ellos, pero incluso a pequeña escala estas cosas se notan.

Ya me dirás.

Hola buenas! Si tienes razón en lo que comentas y se deben tener en cuenta los aspectos del diseño antes de comenzar.

He estado pensando y he estado esta tarde dándole vueltas para ver de que forma se puede abordar el problema y como aplicarlo, he hecho algunas modificaciones en el menu que creo que se ajustan mejor a lo que me has aconsejado, te lo pongo aquí:

1-Clonar SD 
    1.1 Ruta predefinida 
    1.2 Iniciar copia (se lanza Win32DiskImager)
2-Grabar SDs múltiples (NO se vuelve al menú hasta que no finaliza todas las grabaciones)
    2.1 Selección unidades
    2.2 Ruta predefinida
    2.3 Iniciar grabación múltiple
3-Grabación SD personalizada (Tareas concurrentes)
    3.1 perfil 1 (Pondremos en cada perfil una ruta y unidades predefinidas)
    3.2 perfil 2
    3.3 perfil 3 
    3.4 Iniciar grabación personalizada (Nos pregunta que perfil queremos grabar)
4-Dar formato (Tareas concurrentes)
    4.1 Selección unidades
    4.2 Iniciar formato
5-Salir

He pensado que se hace necesario que dentro de cada opción del menu haya un pequeño submenú que conga la ruta y la selección de las unidades de esa opción, así queda todo más ordenado y creo que se soluciona un poco el problema de los menús.

Te los comento un poco por encima:

Tanto la opción 3 como la 4 serian tareas concurrentes, con lo que se lanzaría la tarea que hayamos configurado y se volvería inmediatamente al menu para configurar otra nueva tarea.

-Por ejemplo entramos en la opción 3 de grabación personalizada y en el submenú podríamos tener una serie de opciones que he llamado "perfiles" en las que definiremos para cada perfil una ruta y unas unidades, una vez rellenado esto le daremos a la opción "3.4 iniciar grabación personalizada" en la que nos preguntara que perfil queremos usar para grabar y le colocaremos la opción que corresponda. Una vez se inicie la grabación del perfil automáticamente nos mandaría al menu principal por si queremos seguir grabando otro perfil.

-Si por ejemplo entramos a la opción 2, pues configuraríamos una ruta predefinida y unas unidades donde grabar y esto se guardaría, luego le daríamos a la opción de grabar SD múltiples, y hasta que no se graben todas las SD no debería mandarnos al menu principal.

Bueno ya me comentas que te parece todo y si lo ves más ordenado antes de comenzar a programar cada una de las opciones.

Un saludo.

Me parece muy bien organizado el diseño. Tal como lo planteas parece que debería crearse un menú maestro con cinco opciones con submenúes (de dos, tres o cuatro opciones) para las cuatro primeras opciones. Pero tal vez no sea necesario ser tan riguroso. Por ejemplo en la opción 1 se puede pedir la información de ruta y nombre pero ofreciendo en la propia petición unos valores por defecto, para finalmente lanzar el proceso de clonación. Para la opción 3 yo había pensado (y de ahí la necesidad de que sea una opción "concurrente") que lo que llamas perfiles (distintas grabaciones de diferentes imágenes en distintas unidades) fueran, precisamente, llamadas recurrentes a esa opción, en cada una de ellas se podría seleccionar una imagen y una unidad. De todas formas ya me voy a retirar de este "proyecto" (con el que he disfrutado mucho pero ya le he dedicado bastante), lo que no quiere decir que no te vaya a echar una mano encantado si te atascas en algo (y te la puedo echar) o para cualquier otra cosa.

De todas formas te adjunto una versión que contempla todas estas cosas (tal como yo las veo, que no tiene porque ser exactamente lo que buscas). Sálvalo como MENUSD.BAT (por lo de la auto-referencia) y guárdalo dónde estaban los otros BAT relacionados con la grabación. Obviamente la opción de dar formato está sin rellenar porque no sé que programas o comandos usas para ello. Si hubiera algo que no funciona dímelo, que eso no va incluido en mi "retirada"

:: ‚¡¢£¿µÖàé?¤¥¨­ -> Caracteres MSDOS
:: ÁéíóúÁÉÍÓÚüÜñÑ ¿¡ -> Caracteres Windows
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Menu.bat Menú para ejecución sencilla de tareas
:: (C) GGG junio 2017
:: Basado en uno de Cristóbal González Almirón 2014
::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
Setlocal EnableDelayedExpansion
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Valores por defecto de las variables
::::::::::::::::::::::::::::::::::::::::::::::::::::::
set CarpGrab=c:\tmp\Nueva carpeta
set NbreImg=Image
set RutaImg=c:\tmp\Nueva carpeta\Image
set unidades=G, H
set unidad=G
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ejecución directa de opciones del menú
IF NOT "%1"=="" GOTO subcomandos
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:inicio_menu
cls
echo.
echo -------------------------------------------
echo    Men£ Grabaci¢n SD
echo -------------------------------------------
set OPCION=1
set ELEGIDA=
:menu
set LISTASEL=
:::::::::::::::::::::::::::::::::::::
:: Opciones de menú
:::::::::::::::::::::::::::::::::::::
set ETIQUETA=clonarSD
set TEXTO=Clonar SD
set TECLA=1
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDm
set TEXTO=Grabar SDs m£ltiples
set TECLA=2
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDp
set TEXTO=Grabaci¢n SD personalizada
set TECLA=3
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=darFormato
set TEXTO=Dar Formato
set TECLA=4
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=salir
set TEXTO=Salir
set TECLA=5
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto fin
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
choice /C %LISTASEL% /M "Elija una opci¢n de las anteriores " 
set ELEGIDA=%errorlevel%
set OPCION=1
goto menu
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos externos: se ejecutan en procesos separados
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Subcomandos
echo -------------------------------------------
Echo Men£ Grabaci¢n SD. Subcomando %1
echo -------------------------------------------
:: Ejecución del subcomando
goto %1
echo.
echo ERROR. Subcomando no reconocido %1
echo.
pause
goto fin
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:clonarSD
cls
echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
set /p CarpGrab=¨En qu‚ carpeta desea que se guarde la imagen (%CarpGrab%)? 
if exist "%CarpGrab%" goto nombre
echo No existe la carpeta %CarpGrab%
set /p Es_Crear=¨Quiere crearla (S/N)? 
if not %Es_Crear%==S if not %Es_Crear%==s goto :inicio_menu
md %CarpGrab%
:nombre
set /p NbreImg=¨Qu‚ nombre desea ponerle al archivo (%NbreImg%)?
echo se va a realizar la clonaci¢n sobre %CarpGrab%\%NbreImg% 
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "%CarpGrab%\%NbreImg%"
if exist "%CarpGrab%\%NbreImg%" echo Clonaci¢n finalizada&goto finClonar
echo No se ha creado el archivo. Revise el proceso y vuelva a ejecutarlo si procede
:FinClonar
Pause
goto inicio_menu
:GrabarSDm
Cls
Echo OPCION ELEGIDA: %TECLA%. %TEXTO%
Echo.¨¿Unidades d¢nde realizar la grabaci¢n? 
set /p unidades=May£sculas y separadas por coma y espacio (%unidades%) 
:pedirRuta
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImg%)? 
if exist "%RutaImg%" goto sig
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRuta
goto inicio_menu 
:sig   
for %%u in (%unidades%) 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
)
echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
: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 grabaci¢n en !unidad!: %date% %time%
start /b "" cldiw_c !unidad! "%CarpGrab%\%NbreImg%"
goto :eof
:grabarSDp
cls
echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
set /p unidad=¨Unidad d¢nde realizar la grabaci¢n (%unidad%)? 
:pedirRutaP
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImg%)? 
if exist "%RutaImg%" goto sigP
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRutaP
:sigP
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% "%RutaImg%"
goto inicio_menu 
:darFormato
cls
echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
echo Aqu¡ ir¡an las acciones para formatear unidades SD
goto fin
:salir
goto fin
:Fin
Pause
rem exit

Agradezco enormemente el trabajo que has realizado y tengo ya realizado mucho mas de lo que necesitaba en un principio. He trasteado un poco con lo que me has pasado y me gusta tal y como el programa lanza cada una de las opciones, pero no se porque cuando en las opciones 2 y 3 el programa me pide la ruta donde se encuentra mi imagen para grabar me dice que no la encuentra,:

no se si tengo que colocar alguna ruta en lo ultimo que me has pasado, en principio tengo los demás archivos de grabación y lo de la barra de progreso.

Un saludo.

Este es mi contenido:

CLDIW_C.bat:

@echo off
title=cldiw_%1
if #%1#==## goto :sinDisco
if not exist %2 goto :sinImagen
start "Control grabacion unidad %1" GrabCont %1
"C:\Users\Mario\Desktop\APRENDER BATCH\CommandLineDiskImager\CommandLineDiskImager.exe" %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

GRABCONT.bat:

:: Se encarga de controlar el progreso de la grabación en la unidad correspondiente
:: Si el proceso de grabación es muy lento puede ser necesario reajustar la temporización del ping anterior al bucle
:: Si es insuficiente puede dar un error tipo "No se esperaba ( en este momento" o alguna similar
@echo off
title=GrabCont%1
mode con lines=4
mode con cols=40
Setlocal EnableDelayedExpansion
ping -n 2 localhost >nul
for /f "tokens=8* 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 10 localhost >nul
:bucle
for /f "tokens=*" %%a in ('type Grab%1.log^|find "writing"') 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%00/%max%
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 98 goto :fin
ping -n 1 localhost >nul
goto :bucle
:fin
pause
mode con lines=25
mode con cols=90

Creo que te sobran las comillas en la ruta. Hay que incluir entre comillas las rutas que tengan espacio cuando forman parte directa de un parámetro de un comando. Cuando se trata de rellenar una variable va a tomar la cadena completa hasta el Intro. El propio BAT incluye las comillas al comprobar la existencia. Por cierto que lo razonable es que ajustes los "valores por defecto" del MENUSD.BAT a tu entorno de trabajo. De esa manera te evitarás tener que escribir rutas la mayor parte de las veces.

Vale si que era problema de las comillas, ya no me da error al insertar la ruta, pero justo antes de iniciar la grabación me dice que no encuentra el archivo cldiw_c 

Cosa que no entiendo ya que lo tengo en la carpeta con ese nombre y antes si que me lo encontraba el antiguo menú que tenia.

Saludos

Es que depende de cómo se lance el MENUSD.BAT. Yo suelo entrar en una ventana CMD (en este caso como administrador) y me ubico antes de lanzarlo en la carpeta donde tengo los BAT, con lo cual el directorio por defecto es el de esa carpeta. Si lo lanzas directamente desde Windows el directorio por defecto es c:\Windows\System32 y ahí no encuentra el CLDIW_C.

Añade en la sección de "Valores por defecto":

set CD=<la carpeta donde tienes los bat>

cd %CD%

Con esto ya debe funcionar. Pero avísame si no fuera así.

Pese a que le he añadido la nueva ruta para situarme en esa carpeta y le he predefinido una ruta por defecto en el archivo bat de menu:

me sigue dando error a la hora de grabar:

No entiendo porque me dice que no existe el archivo "c:\tmp\Nueva carpeta\Image" cuando yo le he dado otra ruta de imagen (D:\Imagenes SD\ExclusivaTrebol)

He probado en el archivo de configuración a ponerle comillas y también se las he quitado a la ruta, pero no funciona de ninguna de las maneras.

-Esto que te comento me sucede con la opción 2. En la opción 3 de grabación personalizada cuando le pongo una unidad y una ruta de imagen me lo acepta y pone que va a empezar a grabar, pero no me lanza la grabación ni me sale la barra de progreso, simplemente me lleva al menu y no sucede nada más.

Tienes razón. No está bien resuelto lo de usar la opción por defecto solo sí no se pone un nuevo valor. Ahora tengo que irme, pero esta tarde me pongo con ello y ya te daré la solución. De momento puedes modificar los valores por defecto para que se ajusten a tu entorno, aunque ha venido muy bien que no lo hubieras hecho y hayas dejado los míos, porque así ha cantado.

No te preocupes no tengo prisa, y si ya eso me funciona quedare muy satisfecho, me gusta mucho de la manera que se ha resuelto,  y sobre todo que el programa me ponga la ultima ruta usada por si quiero volver a utilizarla, a mi todo esto no se me hubiera ocurrido.

Creo que ya está resuelto, más o menos decentemente. Creo que no estará de más que lo sometas a todas las pruebas que se te ocurran porque he encontrado alguna otra cosilla que no era del todo correcta. Además de actualizar la versión con lo que te paso hay que corregir en el GRABCONT.BAT la línea que actualmente dice:

for /f "tokens=8* delims=/ " %%a in ('type Grab%1.log') do set max=%%a

para que diga:

for /f "tokens=2* delims=/" %%a in ('type Grab%1.log') do set max=%%a

Y esta sería la versión actual:

:: ‚¡¢£¿µÖàé?¤¥¨­ -> Caracteres MSDOS
:: ÁéíóúÁÉÍÓÚüÜñÑ ¿¡ -> Caracteres Windows
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Menu.bat Menú para ejecución sencilla de tareas
:: (C) GGG junio 2017
:: Basado en uno de Cristóbal González Almirón 2014
::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
Setlocal EnableDelayedExpansion
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Valores por defecto de las variables
::::::::::::::::::::::::::::::::::::::::::::::::::::::
set CD=\users\g\documents\bat
cd %CD%
set CarpGrabD=c:\tmp\Nueva carpeta
set NbreImgD=Image
set RutaImgD=c:\tmp\Nueva carpeta\Image
set unidadesD=G, H
set unidadD=G
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ejecución directa de opciones del menú
IF NOT "%1"=="" GOTO subcomandos
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:inicio_menu
cls
echo.
echo -------------------------------------------
echo    Men£ Grabaci¢n SD
echo -------------------------------------------
set OPCION=1
set ELEGIDA=
:menu
set LISTASEL=
:::::::::::::::::::::::::::::::::::::
:: Opciones de menú
:::::::::::::::::::::::::::::::::::::
set ETIQUETA=clonarSD
set TEXTO=Clonar SD
set TECLA=1
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDm
set TEXTO=Grabar SDs m£ltiples
set TECLA=2
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDp
set TEXTO=Grabaci¢n SD personalizada
set TECLA=3
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=darFormato
set TEXTO=Dar Formato
set TECLA=4
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=salir
set TEXTO=Salir
set TECLA=5
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto fin
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
choice /C %LISTASEL% /M "Elija una opci¢n de las anteriores" 
set ELEGIDA=%errorlevel%
set OPCION=1
goto menu
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos externos: se ejecutan en procesos separados
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Subcomandos
echo -------------------------------------------
Echo Men£ Grabaci¢n SD. Subcomando %1
echo -------------------------------------------
:: Ejecución del subcomando
goto %1
echo.
echo ERROR. Subcomando no reconocido %1
echo.
pause
goto fin
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:clonarSD
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
set /p CarpGrab=¨En qu‚ carpeta desea que se guarde la imagen (%CarpGrabD%)? 
if exist "%CarpGrab%" goto nombre
echo No existe la carpeta %CarpGrab%
set /p Es_Crear=¨Quiere crearla (S/N)? 
if not %Es_Crear%==S if not %Es_Crear%==s goto :inicio_menu
md %CarpGrab%
:nombre
if not "%CarpGrab%"=="" set CarpGrabD=%CarpGrab%
set CarpGrab=%CarpGrabD%
set /p NbreImg=¨Qu‚ nombre desea ponerle al archivo (%NbreImgD%)? 
if not "%NbreImg%"=="" set NbreImgD=%NbreImg%
set NbreImg=%NbreImgD%
echo Se va a realizar la clonaci¢n sobre %CarpGrab%\%NbreImg% 
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "%CarpGrab%\%NbreImg%"
if exist "%CarpGrab%\%NbreImg%" echo Clonaci¢n finalizada&goto finClonar
echo No se ha creado el archivo. Revise el proceso y vuelva a ejecutarlo si procede
:FinClonar
Pause
goto inicio_menu
:GrabarSDm
Cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
¿Echo ¨Unidades d¢nde realizar la grabaci¢n?
set /p unidades=May£sculas y separadas por coma y espacio (%unidadesD%) 
if not "%unidades%"=="" set unidadesD=%unidades% 
set unidades=%unidadesD%
:pedirRuta
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImgD%)?
if not "%RutaImg%"=="" set RutaImgD=%RutaImg% 
set RutaImg=%RutaImgD%
if exist "%RutaImg%" goto sig
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRuta
goto inicio_menu 
:sig   
for %%u in (%unidades%) 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
)
echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
: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 grabaci¢n en !unidad!: %date% %time%
start /b "" cldiw_c !unidad! "%RutaImg%"
goto :eof
:grabarSDp
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
set /p unidad=¨Unidad d¢nde realizar la grabaci¢n (%unidad%)? 
if not "%unidad%"=="" set unidadD=%unidad% 
set unidad=%unidadD%
:pedirRutaP
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImgD%)? 
if not "%RutaImg%"=="" set RutaImgD=%RutaImg% 
set RutaImg=%RutaImgD%
if exist "%RutaImg%" goto sigP
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRutaP
:sigP
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% "%RutaImg%"
goto inicio_menu 
:darFormato
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
echo Aqu¡ ir¡an las acciones para formatear unidades SD
goto fin
:salir
goto fin
:Fin
Pause
rem exit

Corrige los "Valores por defecto", especialmente el de la variable CD.

Prueba todo lo que se te ocurra y me dices lo que sea.

Perfecto, con este ultimo cambio ya funciona todo! He estado haciendo bastantes pruebas y no noto ningún error de funcionamiento, he probado a grabar SD en la opción 2 y cuando me lleva al menu vuelvo a la opción 2 y pongo otra ruta y me la graba sin problema, por lo que si que echo en falta es que en esta opción me guarde al menos 2 rutas distintas para por ejemplo grabar 2 SD de una ruta y otras 2 SD de otra ruta de forma simultanea.

A las malas lo que haré será duplicar en el menu la opción 2 y asignarle a ese clon de opción su propia ruta y unidades, de esta forma para hacer tareas repetitivas no tendría que estar poniendo la ruta cada vez.

Bueno lo dicho estoy muy agradecido con el proyecto y en cuanto implemente la opción de formateo lo postearé aquí.

Un saludo!

¿Estás hablando de la opción 2 o de la 3? Porque tal como dijimos la opción 2 no debería volver al menú hasta terminar todas las grabaciones, ¿no?

Si hablo de la 2, es cierto que dijimos que no debería de volver al menu, pero a mi si me deja volver, e hice la prueba de intentar grabar de nuevo y parece que funciona correctamente por lo que no lo he considerado un fallo.

En un principio mi idea era que la opción 3 me permitiera elegir varias SD que se graben en una ruta y otras tantas que se graben en otra ruta, pero tal como me lo has presentado, en la opción 3 solo me deja grabar una única unidad por cada vez que entro en la opción, por eso he estado usando la opción 2 que si me deja grabar varias unidades simultaneas.

La única pega es lo que te comento que necesitaría al menos 2 rutas por defecto (ya que yo habitualmente grabo dos imágenes distintas ubicadas en sitios diferentes y una vez grabo de un tipo y a la siguiente vez grabo el otro tipo y continuamente tengo que estar cambiando la ruta manualmente)

Tal como lo cuentas parece que en lugar de una opción 2 y una opción 3 necesitarías dos opciones 2, como habías sugerido. Lo cierto es que deja volver al menú porque no conseguí impedirlo (manteniendo la grabación concurrente, si le pongo la opción /WAIT al comando START espera a que termine la ejecución anterior antes de lanzar la siguiente). Pero aparentemente una nueva ejecución de la opción 2 te deja elegir de nuevo unidades y ruta, ¿por qué necesitas, entonces, otra opción? ¿Para no tener que teclear de nuevo la ruta? Respecto a la opción 3 la razón por la que la programé así es que no acababa de entender la diferencia con la opción 2 (y ahora incluso la entiendo menos. Si te parece intenta reajustar el menú a tus necesidades y si te surge algún problema me lo comentas.

Si justo, necesito 2 opciones 2 porque de la forma en la que esta ahora si quiero grabar varias SD de una ruta y luego otras SD de otra ruta y así alternando continuamente voy a tener que escribir siempre la ruta, y es un fastidio ya que son solo dos rutas las que yo uso, con lo cual intentare duplicar la opción 2 y no me voy a complicar más. Es cierto que la opción 2 y 3 no tienen demasiadas diferencias, por lo que tu me lo hayas dejado la opción 3 tal y como esta ha sido una decisión acertada ya que o sino no habría ninguna diferencia entre la las opciones 2 y 3, yo me he dado cuenta de eso al necesitar lo que te he comentado de las rutas. Pero ha sido culpa de mi mala planificación desde un principio.

Resumiendo, tal y conforme esta el programa esta bien, incluso esos "errores" como lo de que vuelve al menu la opción 2 me han venido bien, por lo que tan solo necesito otra opción 2 que me permita elegir otra ruta.

Seria algo así:

1 Clonar SD

2 Grabación múltiple ruta A

3 Grabacion multiple ruta B

4- Grabacion personalizada

Pues solo tendrás que duplicar el código correspondiente a la opción 2, recolocar la opción 3 (para que pase a ser la cuatro) y la 4 (para que pase a ser la cinco) y crear variables por defecto y operativas para RutaImg (Ruta2ImgD y Ruta2Img, por ejemplo) y unidades (unidades2 y unidades2D, por ejemplo). Si te da problemas me lo dices.

Llevo toda la tarde liado con esto y he conseguido implementar el menu tal y como quería y ahora la opción 2 y 3 tienen sus propias rutas y unidades, el problema es que seguramente no he colocado las variables de la opción 3 bien. Ya que cuando el programa me muestra las unidades por defecto y me da la opción de colocar otras unidades, pues resulta que no me cambia de unidades, aquí el ejemplo:

Pese a que le he dicho que quiero usar la unidad J, el no me toma ese valor y me sigue diciendo que no hay G y H.

Esto me sucede el la unidad 2 y en la 3(que es el clon de la 2)

Lo único que necesito es que tanto la opción 2 como la 3 me guarde una ruta y unas unidades predefinidas pero que si quiero cambiarlas que me dejen.

Esto es lo que he modificado:

:: ‚¡¢£¿µÖàé?¤¥¨­ -> Caracteres MSDOS
:: ÁéíóúÁÉÍÓÚüÜñÑ ¿¡ -> Caracteres Windows
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Menu.bat Menú para ejecución sencilla de tareas
:: (C) GGG junio 2017
:: Basado en uno de Cristóbal González Almirón 2014
::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
Setlocal EnableDelayedExpansion
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Valores por defecto de las variables
::::::::::::::::::::::::::::::::::::::::::::::::::::::
set CD=\users\g\documents\bat
cd %CD%
set CarpGrabD=c:\tmp\Nueva carpeta
set NbreImgD=Image
set Ruta1ImgD=D:\Imagenes SD\ExclusivaTrebol
set Ruta2ImgD=D:\Imagenes SD\HE
set unidades1D=G, H
set unidades2D=K
set unidadD=G
set CD=C:\Users\Mario\Desktop\APRENDER BATCH\GRABACION CON BARRA
cd %CD%
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ejecución directa de opciones del menú
IF NOT "%1"=="" GOTO subcomandos
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:inicio_menu
cls
echo.
echo -------------------------------------------
echo    Men£ Grabaci¢n SD
echo -------------------------------------------
set OPCION=1
set ELEGIDA=
:menu
set LISTASEL=
    :::::::::::::::::::::::::::::::::::::
    :: Opciones de menú
    :::::::::::::::::::::::::::::::::::::
    set ETIQUETA=clonarSD
    set TEXTO=Clonar SD
    set TECLA=1
    if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
    if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
       rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
       if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
       set LISTASEL=%LISTASEL%%TECLA%
       set /a "OPCION+=1"
    set ETIQUETA=grabarSDm
    set TEXTO=Grabar SDs m£ltiples A
    set TECLA=2
    if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
    if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
    rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
    if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
    set LISTASEL=%LISTASEL%%TECLA%
    set /a "OPCION+=1"
    set ETIQUETA=grabarSDm2
    set TEXTO=Grabar SDs m£ltiples B
    set TECLA=3
    if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
    if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
    rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
    if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
    set LISTASEL=%LISTASEL%%TECLA%
    set /a "OPCION+=1"
    set ETIQUETA=grabarSDp
    set TEXTO=Grabaci¢n SD personalizada
    set TECLA=4
    if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
    if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
    rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
    if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
    set LISTASEL=%LISTASEL%%TECLA%
    set /a "OPCION+=1"
    set ETIQUETA=darFormato
    set TEXTO=Dar Formato
    set TECLA=5
    if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
    if "%OPCION%"=="%ELEGIDA%" echo OPCION ELEGIDA:  %TECLA%. %TEXTO%
    if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
    if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
    set LISTASEL=%LISTASEL%%TECLA%
    set /a "OPCION+=1"
    set ETIQUETA=salir
    set TEXTO=Salir
    set TECLA=6
    if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
    if "%OPCION%"=="%ELEGIDA%" goto fin
    rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
    if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
    set LISTASEL=%LISTASEL%%TECLA%
    set /a "OPCION+=1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
choice /C %LISTASEL% /M "Elija una opci¢n de las anteriores" 
set ELEGIDA=%errorlevel%
set OPCION=1
goto menu
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos externos: se ejecutan en procesos separados
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Subcomandos
echo -------------------------------------------
Echo Men£ Grabaci¢n SD. Subcomando %1
echo -------------------------------------------
:: Ejecución del subcomando
goto %1
echo.
echo ERROR. Subcomando no reconocido %1
echo.
pause
goto fin
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:clonarSD
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
set /p CarpGrab=¨En qu‚ carpeta desea que se guarde la imagen (%CarpGrabD%)? 
if exist "%CarpGrab%" goto nombre
echo No existe la carpeta %CarpGrab%
set /p Es_Crear=¨Quiere crearla (S/N)? 
if not %Es_Crear%==S if not %Es_Crear%==s goto :inicio_menu
md %CarpGrab%
:nombre
if not "%CarpGrab%"=="" set CarpGrabD=%CarpGrab%
set CarpGrab=%CarpGrabD%
set /p NbreImg=¨Qu‚ nombre desea ponerle al archivo (%NbreImgD%)? 
if not "%NbreImg%"=="" set NbreImgD=%NbreImg%
set NbreImg=%NbreImgD%
echo Se va a realizar la clonaci¢n sobre %CarpGrab%\%NbreImg% 
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "%CarpGrab%\%NbreImg%"
if exist "%CarpGrab%\%NbreImg%" echo Clonaci¢n finalizada&goto finClonar
echo No se ha creado el archivo. Revise el proceso y vuelva a ejecutarlo si procede
:FinClonar
Pause
goto inicio_menu
:GrabarSDm
Cls
Echo opcién elegida: %tecla%. %Texto%
¿Echo ¨Unidades d¢nde realizar la grabaci¢n?
set /p unidades=May£sculas y separadas por coma y espacio (%unidades1D%) 
if not "%unidades%"=="" set unidadesD=%unidades% 
set unidades=%unidades1D%
:pedirRuta
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%Ruta1ImgD%)?
if not "%RutaImg%"=="" set RutaImgD=%RutaImg% 
set RutaImg=%Ruta1ImgD%
if exist "%RutaImg%" goto sig
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRuta
goto inicio_menu 
:sig   
for %%u in (%unidades1D%) 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
)
echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
: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 grabaci¢n en !unidad!: %date% %time%
start /b "" cldiw_c !unidad! "%RutaImg%"
goto :eof
:GrabarSDm2
Cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
¿Echo ¨Unidades d¢nde realizar la grabaci¢n?
set /p unidades=May£sculas y separadas por coma y espacio (%unidades2D%) 
if not "%unidades%"=="" set unidadesD=%unidades% 
set unidades=%unidades2D%
:pedirRuta
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%Ruta2ImgD%)?
if not "%RutaImg%"=="" set RutaImgD=%RutaImg% 
set RutaImg=%Ruta2ImgD%
if exist "%RutaImg%" goto sig
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRuta
goto inicio_menu 
:sig   
for %%u in (%unidades2D%) 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
)
echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
: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 grabaci¢n en !unidad!: %date% %time%
start /b "" cldiw_c !unidad! "%RutaImg%"
goto :eof
:grabarSDp
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
set /p unidad=¨Unidad d¢nde realizar la grabaci¢n (%unidad%)? 
if not "%unidad%"=="" set unidadD=%unidad% 
set unidad=%unidadD%
:pedirRutaP
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImgD%)? 
if not "%RutaImg%"=="" set RutaImgD=%RutaImg% 
set RutaImg=%RutaImgD%
if exist "%RutaImg%" goto sigP
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRutaP
:sigP
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% "%RutaImg%"
goto inicio_menu 
:darFormato
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
echo Aqu¡ ir¡an las acciones para formatear unidades SD
goto fin
:salir
goto fin
:Fin
Pause
rem exit

Con esto ya doy por finalizado el proyecto.

Un saludo!

Has adaptado más o menos bien las variables por defecto, pero no las operativas. Y tienes que tener en cuenta que alguna variable se usaba en las antiguas opciones 2 y 3 (en concreto RutaImg) por lo que el cambio de nombre afectaría a la antigua opción 3, nueva opción 4. Tal vez mejor no cambiarla de nombre (o crear variable específica para opción 4)

Por tanto:

Variables por defecto (es una sugerencia):

RutaImgD (se usaría en opción 2 y nueva opción 4)

Ruta2ImgD (se usaría en nueva opción 3)

UnidadesD (se usaría en opción 2)

Unidades2D (se usaría en nueva opción 3)

Variables operativas:

RutaImg (se usaría en opción 2 y nueva opción 4)

Ruta2Img (se usaría en nueva opción 3)

Unidades (se usaría en opción 2)

Unidades2 (se usaría en nueva opción 3)

Es lógico que te resulte un poco difícil "bregar" con un código hecho por otra persona, no te preocupes.

Por cierto, hay un "echo" precedido de una "¿" que es el que provoca el mensaje

"¬Echo" no se reconoce como un comando...

No es una sino dos. Y también he visto que has duplicado, sin renombrar, las etiquetas destino de los GOTO (pedirRuta, sig, grabar). En cada opción deben tener un nombre.

Al final he decidido subir una versión que, más o menos, se ajuste a lo que pretendes. Como siempre te recomiendo que la pruebes a fondo porque ya es bastante complejo el tratamiento y puede haber agujeros (de hecho he encontrado algunos en mi versión anterior). Sigue vacante la opción de formateo.

:: ‚¡¢£µÖà遚¤¥¨­ -> Caracteres MSDOS
:: ÁéíóúÁÉÍÓÚüÜñÑ ¿¡ -> Caracteres Windows
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Menusd.bat Menú para ejecución sencilla de tareas
:: (C) GGG junio 2017
:: Basado en uno de Cristóbal González Almirón 2014
::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
Setlocal EnableDelayedExpansion
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Valores por defecto de las variables
::::::::::::::::::::::::::::::::::::::::::::::::::::::
set CD=C:\Users\Mario\Desktop\APRENDER BATCH\GRABACION CON BARRA
cd %CD%
set CarpGrabD=c:\tmp\Nueva carpeta
set NbreImgD=Image
set RutaImgD=D:\Imagenes SD\ExclusivaTrebol
set Ruta2ImgD=D:\Imagenes SD\HE
set unidadesD=G, H
set unidades2D=K
set unidadD=G
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ejecución directa de opciones del menú
IF NOT "%1"=="" GOTO subcomandos
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:inicio_menu
cls
echo.
echo -------------------------------------------
echo    Men£ Grabaci¢n SD
echo -------------------------------------------
set OPCION=1
set ELEGIDA=
:menu
set LISTASEL=
:::::::::::::::::::::::::::::::::::::
:: Opciones de menú
:::::::::::::::::::::::::::::::::::::
set ETIQUETA=clonarSD
set TEXTO=Clonar SD
set TECLA=1
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDm
set TEXTO=Grabar SDs m£ltiples A
set TECLA=2
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDm2
set TEXTO=Grabar SDs m£ltiples B
set TECLA=3
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=grabarSDp
set TEXTO=Grabaci¢n SD personalizada
set TECLA=4
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=darFormato
set TEXTO=Dar Formato
set TECLA=5
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto %ETIQUETA%
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
set ETIQUETA=salir
set TEXTO=Salir
set TECLA=6
if "%ELEGIDA%"=="" echo %TECLA%-%TEXTO%
if "%OPCION%"=="%ELEGIDA%" goto fin
rem if "%OPCION%"=="%ELEGIDA%" start %CD%\menusd.bat %ETIQUETA%
if "%OPCION%"=="%ELEGIDA%" goto inicio_menu
set LISTASEL=%LISTASEL%%TECLA%
set /a "OPCION+=1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.
choice /C %LISTASEL% /M "Elija una opci¢n de las anteriores"
set ELEGIDA=%errorlevel%
set OPCION=1
goto menu
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos externos: se ejecutan en procesos separados
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Subcomandos
echo -------------------------------------------
Echo Men£ Grabaci¢n SD. Subcomando %1
echo -------------------------------------------
:: Ejecución del subcomando
goto %1
echo.
echo ERROR. Subcomando no reconocido %1
echo.
pause
goto fin
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subcomandos
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:clonarSD
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
set /p CarpGrab=¨En qu‚ carpeta desea que se guarde la imagen (%CarpGrabD%)?
if not "%CarpGrab%"=="" set CarpGrabD=%CarpGrab%
set CarpGrab=%CarpGrabD%
if exist "%CarpGrab%" goto nombre
echo No existe la carpeta %CarpGrab%
set /p Es_Crear=¨Quiere crearla (S/N)? 
if not %Es_Crear%==S if not %Es_Crear%==s goto :inicio_menu
md %CarpGrab%
:nombre
set /p NbreImg=¨Qu‚ nombre desea ponerle al archivo (%NbreImgD%)? 
if not "%NbreImg%"=="" set NbreImgD=%NbreImg%
set NbreImg=%NbreImgD%
echo Se va a realizar la clonaci¢n sobre %CarpGrab%\%NbreImg%
"C:\Program Files (x86)\ImageWriter\Win32DiskImager.exe" "%CarpGrab%\%NbreImg%"
if exist "%CarpGrab%\%NbreImg%" echo Clonaci¢n finalizada&goto finClonar
echo No se ha creado el archivo. Revise el proceso y vuelva a ejecutarlo si procede
:FinClonar
Pause
goto inicio_menu
:GrabarSDm
Cls
Echo opcién elegida: %tecla%. %Texto%
¿Echo ¨Unidades d¢nde realizar la grabaci¢n?
set /p unidades=May£sculas y separadas por coma y espacio (%unidadesD%) 
if not "%unidades%"=="" set unidadesD=%unidades%
set unidades=%unidadesD%
:pedirRuta
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImgD%)? 
if not "%RutaImg%"=="" set RutaImgD=%RutaImg%
set RutaImg=%RutaImgD%
if exist "%RutaImg%" goto sig
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRuta
goto inicio_menu
:sig
for %%u in (%unidades%) 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
)
rem echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
: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 grabaci¢n en !unidad!: %date% %time%
start /b "" cldiw_c !unidad! "%RutaImg%"
goto :eof
:grabarSDm2
cls
echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
echo ¨Unidades d¢nde realizar la grabaci¢n?
set /p unidades2=May£sculas y separadas por coma y espacio (%unidades2D%) 
if not "%unidades2%"=="" set unidades2D=%unidades2%
set unidades2=%unidades2D%
:pedirRuta2
set /p Ruta2Img=¨Ruta desde la que realizar la grabaci¢n (%Ruta2ImgD%)? 
if not "%Ruta2Img%"=="" set Ruta2ImgD=%Ruta2Img%
set Ruta2Img=%Ruta2ImgD%
if exist "%Ruta2Img%" goto sig2
echo No existe el archivo imagen %Ruta2Img%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRuta2
goto inicio_menu
:sig2
for %%u in (%unidades2%) 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 :grabar2
)
rem echo Espere a que terminen todas las grabaciones antes de continuar
pause
goto inicio_menu
:grabar2
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! "%Ruta2Img%"
goto :eof
:grabarSDp
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
set /p unidad=¨Unidad d¢nde realizar la grabaci¢n (%unidadD%)? 
if not "%unidad%"=="" set unidadD=%unidad%
set unidad=%unidadD%
:pedirRutaP
set /p RutaImg=¨Ruta desde la que realizar la grabaci¢n (%RutaImgD%)? 
if not "%RutaImg%"=="" set RutaImgD=%RutaImg%
set RutaImg=%RutaImgD%
if exist "%RutaImg%" goto sigP
echo No existe el archivo imagen %RutaImg%
set /p Es_Abortar=¨Quiere abortar el proceso (S/N)? 
if not %Es_Abortar%==S if not %Es_Abortar%==s goto :pedirRutaP
goto inicio_menu
:sigP
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% "%RutaImg%"
goto inicio_menu
:darFormato
cls
echo OPCIéN ELEGIDA:  %TECLA%. %TEXTO%
echo Aqu¡ ir¡an las acciones para formatear unidades SD
goto fin
:salir
goto fin
:Fin
Pause
rem exit

Te advierto que el editor de la página a veces cambia cosas (por ejemplo creo que a veces abre interrogación al principio de línea si encuentra el símbolo de cierre de interrogación al final de la misma, suele poner  mayúsculas en los cls y pause, etc.). Si quieres puedo subir a mega el texto tal cual y te paso el enlace.

He decidido hacer lo de mega. Este es el enlace:

https://mega.nz/#!ZphQCRJB!54onLhygg7TdMH3EboFXkqPyXx3zWaTKMnem8iP7SIg

Cuando me avises de que te lo has descargado lo elimino.

Hola! Me encuentro unos días en valencia por motivos de trabajo asique hasta mañana no podre probar lo que me has pasado. Gracias y ya te comentare que tal va la nueva version.

Un saludo!

No te preocupes. Seguro que en Valencia pasarás menos calor que aquí en Madrid. Ya me cuentas, cuando tengas algo que contarme.

Hola buenas, ya estoy en casa, he descargado la versión y funciona perfectamente! Ahora puedo tener guardados 2 tipos de perfil para 2 tipos de grabaciones.

Para la opción 5 intentare usar el comando diskpart que es un comando muy interesante que permite la gestión de discos con más opciones y más rápidos que usando la utilidad de disco integrada en windows, lo que tendré que hacer es hacerme una especie de asistente que me lleve de la mano.

Por ejemplo si en cmd tecleo "diskpart" entra en un modo de edición de discos, luego con "list disk" me muestra los diferentes discos que tengo insertados ... aquí lo explican muy bien:

https://www.profesionalreview.com/2016/07/05/usar-diskpart-limpiar-formatear/ 

Esta es la mejor forma que he encontrado de reparar SD o USB que aparentemente están dañados o que vienen de otra plataforma (Mac, Linux) y windows no es capaz de dar formato a esa unidad, y ni desde la utilidad de discos es posible formatear, pues con diskpart si es posible.

Un saludo!

Conocía un poco el diskpart (precisamente a raíz de otra consulta en esta página: Modificar código que copia archivos por extencio a usb ) pero lo cierto es que no lo he usado mucho. Supongo que piensas usarlo en modo script (diskpart /s dskprtcd.txt) en el que dskprtcd.txt sería un archivo en el que vas almacenando de modo secuencial los comandos para el diskpart. Desde el menusd.bat puedes ir generando, de forma más o menos dinámica, las opciones a incorporar a ese archivo de comandos. Si tienes problemas me lo dices.

Nunca he usado ese método que comentas de leer un script externo desde un txt, he hecho una prueba rápida y no me ha funcionado. He creado el archivo de texto "dskprtcd.txt"

Y he modificado la opción 5:

:darFormato
cls
Echo OPCIéN ELEGIDA: %TECLA%. %TEXTO%
Echo Formateo
start diskpart
diskpart /s dskprtcd.txt

y solo consigo que se me abra otra ventana con diskpart pero no me ejecuta los comandos del dskprtcd.txt

Saludos

Tal como lo veo tienes dos invocaciones al diskpart. Una con START y otra sin él. Te sugiero que te familiarices previamente con esa forma de trabajar mediante script. Por ejemplo te creas en una carpeta de prueba (digamos c:\prueba) un archivo de comandos de DISKPART, por ejemplo DSKPRTCD.TXT con este contenido:

List volume 
exit 
* 

Luego abres una ventana CMD con permisos de administrador y te situas en la carpeta de prueba y lanzas el comando:

diskpart /s dskprtcd.txt

Te pongo aquí lo que me sale a mí en una situación similar para que compares:

C:\Users\g\Documents\BAT>type dskprtcd.txt
list volume
exit
*
C:\Users\g\Documents\BAT>diskpart /s dskprtcd.txt
Microsoft DiskPart versión 10.0.15063.0
Copyright (C) Microsoft Corporation.
En el equipo: JUBILADO
  Núm Volumen Ltr  Etiqueta     Fs     Tipo        Tamaño   Estado     Info
  ----------- ---  -----------  -----  ----------  -------  ---------  --------
  Volumen 0     E                      DVD-ROM         0 B  Sin medio
  Volumen 1     C   Windows8_O  NTFS   Partición    694 GB  Correcto   Arranque
  Volumen 2     F   Otros       NTFS   Partición    195 GB  Correcto
  Volumen 3     D   LENOVO      NTFS   Partición     25 GB  Correcto
  Volumen 4         WINRE_DRV   NTFS   Partición   1000 MB  Correcto   Oculto
  Volumen 5         SYSTEM_DRV  FAT32  Partición    260 MB  Correcto   Sistema
  Volumen 6         PBR_DRV     NTFS   Partición     14 GB  Correcto   Oculto
Saliendo de DiskPart...
C:\Users\g\Documents\BAT>

A partir de ahí decides si te puede valer esta forma de trabajo (que creo que sí) y el contenido del script que, lógicamente, se puede generar dinámicamente desde el MENUSD.BAT.

Acabo de ver que hemos vuelto a superar las 40 respuestas, de modo que no me extrañaría que haya vuelto a ocurrir la falta de comunicación vía email. Si entras lo verás.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas