Doddy, permiteme decirte que siempre has utilizado unos contrastes de colores demasiado "altos" para la vista, y yo siempre he respetado los gustos de los demás, pero es que esa GUI es la que más me ha jodido los ojos de todas las que hiciste xD, te lo digo desde el aprecio q sabes q te tengo.
Tu metodología no me parece la mas idonea, más si estás empezando, ya que tanto For anidado y además especificando pasos solo puede acabar liandote, te muestro otro enfoque más liviano que he ideado:
Código
' Creo un Array para almacenar como referencia el rango de semanas GPS.
' Al valor inicial hay que descontarle un '1' (1772) porque el índice de un array empieza por '0'.
PrivateReadOnly GPSWeeks AsInteger()=
Enumerable.Range(1773-1, 1825).ToArray
' Obtengo la cantidad de dias del año actual.
' Esto lo hago por los años bisiestos, que tienen '1' día más (366).
PrivateReadOnly TotalDaysInYear AsInteger=
(From monthAsInteger In Enumerable.Range(1, 12)
Select DateTime.DaysInMonth(Now.Year, month)).Sum
' Ya estamos listos para iterar los elementos ...del modo que uno prefiera :), esto solo es un ejemplo:
PrivateSub Test()HandlesMyBase.Shown
Dim sb AsNew System.Text.StringBuilder
For DayOfYear AsInteger=1To TotalDaysInYear ' (365 or 366)
' Obtengo la fecha exacta dado el número del día del año actual.
Dim DateOfYear As DateTime =New DateTime(Now.Year, 1, 1).AddDays(DayOfYear -1)
sb.AppendLine(String.Format("Day Of Year: {0}", CStr(DayOfYear)))
MessageBox.Show(sb.ToString, "GPS Calendar Info - By Elektro",
MessageBoxButtons.OK, MessageBoxIcon.Information)
sb.Clear()
Next DayOfYear
EndSub
@engel lex
Porfavor, ya que tienes el detalle de llevar las normas del foro en tu firma, la próxima vez podrías intentar respetar la utilización de las etiquetas GeShi, no es un muy buen ejemplo ...
cambiando los menús por choise, todavía conservo la particularidad de la opción por defecto? que es lo que está como [1] en las opciones. Es decir, que no necesito escribir una opción (1-6), sino con sólo dar enter, sin haber introducido un número, se va a esa opción.
El comando Choice espera un UserInput (la interacción por parte del usuario) para seleccionar una opción entre las opciones que especificaste, por lo tanto no hay lugar para predefinir una opción porque el comando obliga a que una de las opciones se deba elegir... ...a menos que especifiques un tiempo de espera máximo y entonces si que puedes especificar también la opción por defecto al terminar el tiempo de espera.
Lee la ayuda del comando.
Cita de: Choice.exe /?
/T tiempo de espera Número de segundos de pausa antes de que se elija una opción predeterminada. Los valores permitidos están comprendidos entre 0 y 9999. Si se especifica 0, no habrá pausa y se seleccionará la opción predeterminada.
/D opción Especifica la opción predeterminada después de nnnn segundos. Carácter debe estar en el conjunto especificado de opciones por la opción /C y también debe especificarse nnnn con /T.
añadir la opción de extraer de forma automática la memoria USB cuando termine de desmontar y cerrar todas las unidades cifradas. Por ahora sólo he encontrado que puedo hacerlo con aplicaciones externas.
Nunca me he interesado por saber como "extraer" un dispositivo extraible de forma automatizada, pero si has encontrado un programa de terceros capaz de hacerlo eso significa que la API de Windows así se lo permite, así que debe haber alguna función en la WinAPI para hacerlo, desconozco cual ...pero la WinAPI olvídate de poder tocarla en Batch.
EDITO: Lo encontré: CM_Request_Device_Eject function + Info, de hecho según he leido en este source esa es la función que utiliza la aplicación 'USBEject' que mencionaste. Es muchísimo más dificil de lo que parece en un principio, hay que usar drivers, si esta fuera la única solución entonces preferiría depender de ese tal "USBEject".
También se me ocurre que quizás en alguna Class (referente a los dispositivos extraibles y/o volúmenes) de WMI puedas invocar el comando (el cual desconozco el nombre, pero debería ser algo como "Eject/Extract") de ejecución del dispositivo (InvokeVerb("Eject")), eso sería más viable porque si encuentras información al respecto entonces puedes reproducirlo en Batch usando el comando WMIC.
EDITO: Encontré algo parecido, escrito en PowerShell:
Esto es simplemente un Form propio para controlar excepciones, lo pueden añadir a sus proyectos como una plantilla.
Imágenes:
(En tiempo de ejecución)
(En diseño)
Inspiración:
Para desarrollar este Form me inspiré en la idea y en el diseño del desarrollador de la aplicación "WinToolkit" (Legolash2o), aunque su diálogo está escrito en C#...y no he visto el source, pero me gustó la idea y el diseño, además de esto examiné a fondo y comparé otros diseños y códigos fuente de la página CodeProject.
Demostración:
Ejemplos de uso:
(Ejemplo de uso básico)
Código
PrivateShadowsSub Shown(sender AsObject, e As EventArgs) _
:OPCIONES_1 Call :MENU_1 Set "Options={Goto :MONTAR_RO}; {Goto :MONTAR_RW}; {Call :MONTAR_RW,Goto :MONTAR_CAL_RO}; {Call :MONTAR_RW,Goto :MONTAR_CAL_RW}; {Call :MONTAR_RW,Goto :ABRIR_BAUL}; {Goto :OPCIONES_6}" Choice.exe /C "123456" /M "Seleccione una opci¢n (1-6) [1]" For /F "Tokens=%ErrorLevel%,* Delims=;" %%# In ('Echo "%Options%"') Do ( For /F "Tokens=2-3 Delims={,}" %%X In ('Echo "%%~#"') Do ((%%~X) && (%%~Y)) ) Call :MENSAJE_7 Timeout.exe 1 1>Nul Goto :OPCIONES_1
REM Esto lo puse solo para testear la llamada a las etiquetas... :MONTAR_RO Echo MONTAR_RO Pause&Exit
:MONTAR_RW Echo MONTAR_RW Exit /B 0 & REM Aquí usas un Call para llamar a este bloque, así que debes indicar un código de salida (0|1).
:MONTAR_CAL_RO Echo MONTAR_CAL_RO Pause&Exit
( Un pobre intento de simular un Array seteando una cadena delimitada, y poder simular también un índice de elementos del Array para poder acceder a un elemento indicando el índice con lo único que nos proporciona Batch para hacer algo semejante ...un For. )
EDITO: Añado otra solución alternativa, más simple:
Código:
SetLocal EnableDelayedExpansion & REM Necesario para expandir la(s) variable(s).
:OPCIONES_1 Call :MENU_1
Set "Choice1=Goto :MONTAR_RO" Set "Choice2=Goto :MONTAR_RW" Set "Choice3=Call :MONTAR_RW;Goto :MONTAR_CAL_RO" Set "Choice4=Call :MONTAR_RW;Goto :MONTAR_CAL_RW" Set "Choice5=Call :MONTAR_RW;Goto :ABRIR_BAUL" Set "Choice6=Goto :OPCIONES_6"
Choice.exe /C "123456" /M "Seleccione una opci¢n (1-6) [1]" Set /A "ChoiceIndex=%ErrorLevel%" For /F "Tokens=1-2 Delims=;" %%X In ('Echo !Choice%ChoiceIndex%!') Do ((%%~X) && (%%~Y))
Qué sería aconsejable modificar para que quedara mejor (más rápido).
Para que sea más rápido debes utilizar otro lenguaje distinto, si en algo destaca Batch es por su incompetencia y lentitud.
Por ejemplo, en Batch debes usar una aplicación externa (Find.exe|Findstr.exe) para buscar patrones de cadenas en otra cadena (la salida de un comando), depender de la ejecucion y del tiempo de ejecución de otro exe y del código de salida que este mande para determinar que se encontró una cadena y/o una expresion regular ...eso ya de por si es una mier-da y es muy lento en comparación con cualquier otro lenguaje.
Además, también dependes de otras aplicaciones como 'TaskList.exe', el cual no muestra una lista de procesos en Tiempo Real, por propia experiencia te puedo decir que a veces el comando tiene una demora de 10-15 segundos en actualizar la lista de procesos para mostrar el proceso que andas buscando, así que para obtener mayor eficacia en Batch podrías hacer una Query a las Classes de WMI utilizando (de nuevo) una aplicación externa, WMIC:
Ej:
Código:
( WMIC.exe Process Where Name='KeyPass.exe' Get /Format:List | Find.exe "=" )1>NUL 2>&1 && (...) || (...)
...en cualquier otro lenguaje no necesitarías depender de ningún exe para verificar si un proceso está corriendo, podrías usar las Classes de WMI diréctamente, lo cual es más rápido sin duda.
Como ya digo, tu Batch-Script no se puede mejorar mucho más, así está perfecto aunque le hagas alguna que otra pequeña modificación como las que he comentado.
supongo que el archivo '33.bat' se encuentra en el directorio 'C:\1', ¿verdad?, en ese caso el motivo de que no encuentre el archivo podría deberse a que el directorio de trabajo actual del Script VBS sea "C:\Windows\System32", no "C:\1".
1: Tienes que montar la imagen que contiene el entorno WinPE de la instalación de Windows, es decir, en mi caso es la imagen con índice 2 del archivo "boot.wim", una vez montada verás la carpeta "...\sources" que mencionas y allí los recursos dll, dicha carpeta y los mismos recursos dll también están en el dvd de windows, puede ser un poco confuso, pero tiene una explicación, esto es porque los recursos del dvd que están a simple vista son las imágenes que se utilizan en el entorno gráfico (Ej: cuando haces doble click en el archivo setup.exe), y los recursos dll de adentro de la imagen boot.wim son las imagenes que se utilizan al bootear, en el entorno "por consola", por eso es recomendable reemplazar los archivos tanto en el dvd como adentro de la imagen boot.wim.
2: Supongo que la conversión que hiciste a PNG la hiciste solamente para subir/compartir la imagen, pero de todas formas, por si acaso, te comento que las imágenes que modifiques deben tener las mismas propiedades (profundidad de color, transparencia, tamaño, extensión) que las imágenes originales.
3: Yo utilizo 'Anolis resourcer' para reemplazar recursos, hay otros programas que me gustan más como el 'ResourceHacker FX', pero prefiero el primero porque es con el que conseguí automatizar la tarea por linea de comandos.