Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#6941
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.

Un saludo!
#6942
Puedes utilizar el método Except para llevar a cabo la tarea:

Código (vbnet) [Seleccionar]
Dim Seriales1 As String = "_xxxxxxxx_zzzzzzzzz"
Dim Seriales2 As String = "_xxxxxxxx_hhhhhhhh_zzzzzzzzz"
Dim Seriales3 As String = String.Join("_", Seriales2.Split("_").Except(Seriales1.Split("_")))


Saludos
#6943
Reacuerdo haber solucionado un tema parecido para VisualBasicScript, quizás te sirva de algo: http://foro.elhacker.net/scripting/batch_obtener_nombre_con_extension-t410321.0.html;msg1926804#msg1926804

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 (vbnet) [Seleccionar]
   ' 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'.
   Private ReadOnly GPSWeeks As Integer() =
       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).
   Private ReadOnly TotalDaysInYear As Integer =
       (From month As Integer 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:
   Private Sub Test() Handles MyBase.Shown

       Dim sb As New System.Text.StringBuilder

       For DayOfYear As Integer = 1 To 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)))
           sb.AppendLine(String.Format("Date: {0}", CStr(DateOfYear)))
           sb.AppendLine(String.Format("GPS Week: {0}", CStr(Me.GPSWeeks(DatePart(DateInterval.WeekOfYear, DateOfYear)))))

           MessageBox.Show(sb.ToString, "GPS Calendar Info - By Elektro",
                           MessageBoxButtons.OK, MessageBoxIcon.Information)

           sb.Clear()

       Next DayOfYear

   End Sub





@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 :P...
#6944
Una manera simple:

Código (vbnet) [Seleccionar]
   Private Sub Test()

       Dim Amount As Integer = -0I
       Dim Unknown As Object = " 5 "

       ' No uses el método 'Val()' para validar, es algo prehistórico ...de VB6.
       Integer.TryParse(Convert.ToString(Unknown).Trim, Amount)

       Dim Buttons As List(Of Button) =
           GetDynamicControls(Of Button)(Collection:=Me.Controls,
                                         NamePattern:="Button",
                                         NameRange:=Enumerable.Range(1, Amount)) ' From Button1 To Button5

       Buttons.ForEach(Sub(bt As Button) bt.Enabled = False)

   End Sub


...Utilizando este método de uso genérico, el cual no he optimizado muy bien y habrá formas más limpias de escribirlo, pero sirve.

Código (vbnet) [Seleccionar]
   ' Get Dynamic Controls
   ' ( By Elektro )
   '
   ''' <summary>
   ''' Gets a range of controls dinamycally by specifying the control's name pattern.
   '''
   ''' To use this method properly, the controls need to have a dynamic name.
   '''
   ''' Example:
   ''' 'Button1', 'Button2', 'Button3', etc..
   ''' Both has the same name and only differs the indexed number.
   '''
   ''' </summary>
   ''' <typeparam name="T"></typeparam>
   ''' <param name="Collection">Indicates the control collection where to find the controls.</param>
   ''' <param name="NamePattern">Indicates the name pattern of the controls.</param>
   ''' <param name="NameRange">Indicates the dynamic indexed pattern range.</param>
   ''' <returns>List(Of T).</returns>
   Private Function GetDynamicControls(Of T)(ByVal Collection As ControlCollection,
                                             ByVal NamePattern As String,
                                             ByVal NameRange As IEnumerable(Of Integer)) As List(Of T)

       If NameRange.Count < 1 Then Return Nothing

       Dim Controls As New List(Of T)

       For Each ctrl As T In Collection.OfType(Of T)()

           For Index As Integer = NameRange.Min To NameRange.Max

               If TryCast(ctrl, Control).Name.Equals(NamePattern & CStr(Index), StringComparison.OrdinalIgnoreCase) Then
                   Controls.Add(ctrl)
               End If

           Next Index

       Next ctrl

       Controls.Reverse() ' Sort them.

       Return Controls.ToList()

   End Function


Saludos
#6945
Cita de: cyberalejo17 en  2 Mayo 2014, 22:19 PM
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.

Ejemplo:
Código (dos) [Seleccionar]
Choice.exe /C "123" /M "Elige" /T 10 /D "3"
(Echo %ErrorLevel%) & REM Resultado: '3'





Citar
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:
Citar$driveEject = New-Object -comObject Shell.Application
$driveEject.Namespace(17).ParseName("E:").InvokeVerb("Eject")
Fuente: http://sushihangover.blogspot.nl/2012/02/powershell-eject-local-or-remote.html

Y lo mismo para VBS:
Citar
Código (vb) [Seleccionar]
For Each d in CreateObject("Scripting.FileSystemObject").Drives
CreateObject("Shell.Application").Namespace(17).ParseName("E:\").InvokeVerb("Eject")
Next
Fuente: http://forums.mydigitallife.info/threads/29412-VBScript-Fast-eject-disk-on-drives

...Se supone que el comando "Eject" sirve tanto para ejecutar CD-Roms como para extraer unidades extraibles, se supone.

Y como última alternativa, con este comando puedes mostrar la ventana de extracción de dispositivos extraibles:
Código (dos) [Seleccionar]
rundll32.exe shell32.dll,Control_RunDLL hotplug.dll, @SystemDir

Saludos.
#6946
Elektro ErrorDialog




Descripción:

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:
[youtube=640,360]http://www.youtube.com/watch?v=rIt_4FrdjMM[/youtube]




Ejemplos de uso:

(Ejemplo de uso básico)
Código (VBNET) [Seleccionar]
   Private Shadows Sub Shown(sender As Object, e As EventArgs) _
   Handles MyBase.Shown

       Try
           Dim Url As New Uri(String.Empty)

       Catch ex As Exception

           Using ErrorDialog As New ErrorDialog(ex, sender)
               ErrorDialog.ShowDialog()
           End Using

       End Try

   End Sub


(Ejemplo de uso avanzado)
Código (VBNET) [Seleccionar]
Public Class Form1

   Public Sub New()

       ' This call is required by the designer.
       InitializeComponent()

       ' Catches Managed Exceptions.
       AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf Application_ManagedException

       ' Catches Unhandled Exceptions.
       AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf Application_UnhandledException

       ' Catches Thread Exceptions.
       AddHandler Application.ThreadException, AddressOf Application_ThreadException

   End Sub

   ''' <summary>
   ''' Handles the 'UnhandledException' event of the Application.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
   Private Sub Application_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)

       Using ErrorDialog As New ErrorDialog(DirectCast(e.ExceptionObject, Exception), Me)
           ErrorDialog.ShowDialog()
       End Using

   End Sub

   ''' <summary>
   ''' Handles the 'FirstChanceException' event of the Application.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="Runtime.ExceptionServices.FirstChanceExceptionEventArgs" /> instance containing the event data.</param>
   Private Sub Application_ManagedException(ByVal sender As Object, ByVal e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)

       Using ErrorDialog As New ErrorDialog(e.Exception, Me)
           ErrorDialog.ShowDialog()
       End Using

   End Sub

   ''' <summary>
   ''' Handles the 'ThreadException' event of the Application.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="Threading.ThreadExceptionEventArgs"/> instance containing the event data.</param>
   Private Sub Application_ThreadException(sender As Object, e As Threading.ThreadExceptionEventArgs)

       Using ErrorDialog As New ErrorDialog(e.Exception, Me)
           ErrorDialog.ShowDialog()
       End Using

   End Sub

End Class





Descarga:

http://www.mediafire.com/download/f6caca6bcc9wbwc/Elektro+ErrorDialog.rar
#6947
Las modificaciones que hiciste son excelentes, no se puede mejorar mucho más.

Pero los menus:
Citar
Código (DOS) [Seleccionar]

:OPCIONES_1
call :MENU_1
set var=1
set /p var= Seleccione una opci¢n (1-6) [1]:
if %var%==1 (goto :MONTAR_RO)
if %var%==2 (goto :MONTAR_RW)
if %var%==3 (call :MONTAR_RW && goto :MONTAR_CAL_RO)
if %var%==4 (call :MONTAR_RW && goto :MONTAR_CAL_RW)
if %var%==5 (call :MONTAR_RW && goto :ABRIR_BAUL)
if %var%==6 (goto :OPCIONES_6)
call :MENSAJE_7
timeout 1 >nul
goto :OPCIONES_1

Podrías hacerlos dinámicos:
(código corregido)
: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:

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))

SetLocal DisableDelayedExpansion
Call :MENSAJE_7
Timeout.exe 1 1>Nul
Goto :OPCIONES_1







CitarQué 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:
( 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.

¡Saludos!
#6948
Lo de la contraseña, prueba a modificar el valor "LogonCount", quizás me equivoco pero intuyo que le asignates un '0' y por eso te da error.


Citar· Omitir la pantalla de selección de usuario (Auto-Loguearse).

Agregamos el componente Microsoft-Windows-Shell-Setup > AutoLogon al paso Specialize y también al paso oobeSystem y aplicamos estos valores:

El número de veces que la cuenta se ha usado:
LogonCount = 1
#6949
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".

Aquí tienes la solución a ese problema: http://foro.elhacker.net/scripting/como_puedo_arrastrar_y_concatenar_archivos_de_texto_en_un_batch-t413258.0.html;msg1938492#msg1938492

saludos
#6950
@Dato000

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.

Saludos!