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

#7243
Scripting / Re: alguien hace este script?
26 Febrero 2014, 15:21 PM
No es que no agrades, es símplemente que las normas se deben leer y respetar, solo eso,
no se puede llegar a un foro y ponerse a infringir todo tipo de normas (las cuales suelen ser las mismas en todos los foros...) sin esperar que al final no te acaben llamando la atención...
siempre tienes la opción de poder seguir publicando posts pero respetando las normas, no creo que sea algo dificil.

Cierro el post a petición del autor.

Saludos!
#7244
Scripting / Re: alguien hace este script?
26 Febrero 2014, 15:01 PM
Porfavor, lee las normas del foro y las normas de este subforo.

Infracciones cometidas:

· Está prohibido escribir al estilo 'Cani', como en este ejemplo, el abuso de mayúsculas solo consigue DiFiCuLtAR la lectura de tu post.

· El título de un tema ha de describir el problema, está prohibido los títulos tipo 'Alguien hace este script?'.

· Los códigos tienen que ir en sus respectivas etiquetas de código, me refiero al de este post

- Está prohibido duplicar temas, como este, si necesitas añadir más información a un tema, usa el botón MODIFICAR, no dupliques el post en otra sección del foro para decir lo mismo.

· Está prohibido 'Negociar', o mejor dicho, proporcionar información personal de contacto en público. Esto todavía no lo has echo, pero se te ve venir la intención... Compra lo que tengas que comprar pero hazlo por privado, esto es un foro serio, no Freelancer.



PD: Espero que no cometas otra infracción ni surga cualquier tipo de réplica sobre las reglas.

Saludos!
#7245
Quiero pensar que te refieres a poder leer la documentación de forma Offline, porque en MSDN tienes todo de forma online...

Con la utilidad Help Viewer de Microsoft (que viene incluida a partir del VS2010) te puedes descargar toda la documentación de MSDN.

También puedes usar Visual Studio 2012/2013 Help Downloader para descargarla (no leerla).

PD: Ya te aviso que solo la documentación de las classes de FW 3.5 y 4.0 ocupan 2 GB y la documentación está empaquetada en un formato que solo es legible por el Help viewer.

Saludos
#7246
Una mini-Class para Blinkear un control (efecto de parpadeo), o el texto de un control:

[youtube=640,360]http://www.youtube.com/watch?v=QmY-EJxhDjs[/youtube]

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 02-25-2014
' ***********************************************************************
' <copyright file="Blinker.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Usage Examples "

'Friend WithEvents LabelBlinker As Blinker

'Private Shadows Sub Shown(sender As Object, e As EventArgs) Handles MyBase.Shown

'    LabelBlinker = New Blinker(Textbox1)

'    LabelBlinker.Blink(Interval:=500)
'    LabelBlinker.BlinkText(Interval:=500, CustomText:="Custom Text!")

'    LabelBlinker.Unblink(Visible:=True)
'    LabelBlinker.UnblinkText(RestoreText:=False)

'End Sub

#End Region

''' <summary>
''' Blinks a Control.
''' </summary>
Friend NotInheritable Class Blinker

#Region " Objects "

   ''' <summary>
   ''' The control to blink.
   ''' </summary>
   Private ctrl As Control = Nothing

   ''' <summary>
   ''' A Timer to blink a control.
   ''' </summary>
   Private WithEvents BlinkTimer As New Timer

   ''' <summary>
   ''' A Timer to blink the text of a control.
   ''' </summary>
   Private WithEvents BlinkTextTimer As New Timer

   ''' <summary>
   ''' A custom text to restore after blinking the control.
   ''' </summary>
   Private TextToRestore As String = String.Empty

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Initializes a new instance of the <see cref="Blinker" /> class.
   ''' </summary>
   ''' <param name="ctrl">Indicates the control to blink.</param>
   Public Sub New(ByVal ctrl As Control)

       ' Assign the control to blink.
       Me.ctrl = ctrl

   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Blinks the Control.
   ''' </summary>
   ''' <param name="Interval">Indicates the blink interval, in ms.</param>
   Public Sub Blink(Optional ByVal Interval As Integer = 500)

       With BlinkTimer
           .Interval = Interval
           .Enabled = True
       End With

   End Sub

   ''' <summary>
   ''' Stop blinking the Control.
   ''' </summary>
   ''' <param name="Visible">Indicates the visibility of the control.</param>
   Public Sub Unblink(Optional ByVal Visible As Boolean = True)

       With BlinkTimer
           .Enabled = False
       End With

       ctrl.Visible = Visible

   End Sub

   ''' <summary>
   ''' Blinks the text content of the Control.
   ''' </summary>
   ''' <param name="Interval">Indicates the blink interval.</param>
   ''' <param name="CustomText">Indicates a custom text to blink.</param>
   Public Sub BlinkText(Optional ByVal Interval As Integer = 500,
                        Optional ByVal CustomText As String = Nothing)

       With BlinkTextTimer
           .Tag = If(String.IsNullOrEmpty(CustomText), Me.ctrl.Text, CustomText)
           .Interval = Interval
           .Enabled = True
       End With

   End Sub

   ''' <summary>
   ''' Stop blinking the text content of the Control.
   ''' </summary>
   ''' <param name="RestoreText">If set to <c>true</c>, the control text is resetted to the initial state before started blinking.</param>
   Public Sub UnblinkText(Optional ByVal RestoreText As Boolean = False)

       With BlinkTextTimer
           .Enabled = False
       End With

       If RestoreText Then
           Me.ctrl.Text = TextToRestore
       End If

   End Sub

#End Region

#Region " Event Handlers"

   ''' <summary>
   ''' Handles the Tick event of the BlinkTimer control.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
   Private Sub BlinkTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles BlinkTimer.Tick

       Me.ctrl.Visible = Not Me.ctrl.Visible

   End Sub

   ''' <summary>
   ''' Handles the Tick event of the BlinkTextTimer control.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
   Private Sub BlinkTextTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles BlinkTextTimer.Tick

       If String.IsNullOrEmpty(Me.ctrl.Text) Then
           Me.ctrl.Text = CStr(sender.tag)

       Else
           Me.ctrl.Text = String.Empty

       End If

   End Sub

#End Region

End Class
#7247
Código (vbnet) [Seleccionar]
   ' String Is Alphabetic?
   ' ( By Elektro )
   '
   ''' <summary>
   ''' Determines whether a String is alphabetic.
   ''' </summary>
   ''' <param name="str">Indicates the string.</param>
   ''' <returns><c>true</c> if string only contains alphabetic characters, <c>false</c> otherwise.</returns>
   Private Function StringIsAlphabetic(ByVal str As String) As Boolean

       Return Not Convert.ToBoolean((From c As Char In str Where Not "abcdefghijklmnopqrstuvwxyz".Contains(c)).Count)

   End Function





Código (vbnet) [Seleccionar]
  ' Get Biggest Letter Of String
   ' ( By Elektro )
   '
   ' Usage Examples
   ' MsgBox(GetBiggestLetter("qwerty012345"))
   '
   ''' <summary>
   ''' Gets the biggest letter in a String.
   ''' </summary>
   ''' <param name="str">Indicates the string.</param>
   ''' <returns>System.Char.</returns>
   Private Function GetBiggestLetter(ByVal str As String) As Char

       Return (From c As Char In str.ToLower
               Where "abcdefghijklmnopqrstuvwxyz".Contains(c)
               Order By c Descending).FirstOrDefault

   End Function


Código (vbnet) [Seleccionar]
   ' Get Lowest Letter Of String
   ' ( By Elektro )
   '
   ' Usage Examples
   ' MsgBox(GetLowestLetter("qwerty012345"))
   '
   ''' <summary>
   ''' Gets the lowest letter in a String.
   ''' </summary>
   ''' <param name="str">Indicates the string.</param>
   ''' <returns>System.Char.</returns>
   Private Function GetLowestLetter(ByVal str As String) As Char

       Return (From c As Char In str.ToLower
               Where "abcdefghijklmnopqrstuvwxyz".Contains(c)
               Order By c Ascending).FirstOrDefault

   End Function


Código (vbnet) [Seleccionar]
   ' Get Biggest Number Of String
   ' ( By Elektro )
   '
   ' Usage Examples
   ' MsgBox(GetBiggestNumber("qwerty012345"))
   '
   ''' <summary>
   ''' Gets the biggest number in a String.
   ''' </summary>
   ''' <param name="str">Indicates the string.</param>
   ''' <returns>System.Int32.</returns>
   Private Function GetBiggestNumber(ByVal str As String) As Integer

       Return Convert.ToInt32((From c As Char In str
                               Where Integer.TryParse(c, New Integer)
                               Order By c Descending).FirstOrDefault, 10)

   End Function


Código (vbnet) [Seleccionar]
   ' Get Lowest Number Of String
   ' ( By Elektro )
   '
   ' Usage Examples
   ' MsgBox(GetLowestNumber("qwerty012345"))
   '
   ''' <summary>
   ''' Gets the lowest number in a String.
   ''' </summary>
   ''' <param name="str">Indicates the string.</param>
   ''' <returns>System.Int32.</returns>
   Private Function GetLowestNumber(ByVal str As String) As Integer

       Return Convert.ToInt32((From c As Char In str
                               Where Integer.TryParse(c, New Integer)
                               Order By c Ascending).FirstOrDefault, 10)

   End Function
#7248
EDITO:
Lo siento pero no podia quedarme de brazos cruzados sin opinar sobre esta frase:
CitarEstudio el primer curso de grado medio de sistemas microinformáticos y acabamos de comenzar con el tema de comandos en el cmd

Yo soy autodidacta, es decir no se muy bien como son los ciclos ni tampoco tengo conocimiento de si esa práctica de enseñanza de Batch es normal en los ciclos de 'sistemas microinformáticos' pero si no me equivoco hay un tema para el desarrollo de Software ...así que lo diré sin rodeos:

En mi opinión ese curso es una estafa y muy poco profesional, con comanditos por Batch no vas a aprender nada de nada, eso no es programación, te están enseñando lo que deberían haberte enseñado en parbularios, Batch no te da una base de programación porque no cumple los standards de lo que se considera un buen lenguaje de programación de hoy en día, por no tener no tiene ni objetos ni métodos ni arrays, es un ""lenguaje"" limitado, retrasado.

...y para salir de cualquier apuro en Windows, siempre puedes recurrir a cualquiera de los otros 3 lenguajes integrados natívamente (VisualBasicScript, javascript y Powershell), que son infinítamente mejores y más aptos.

Así pues, que me digas que te gustaría crear un juego en Batch 'para matar el tiempo'... yo antes que eso te recomendaría el suicidio, abre los ojos, no sigas perdiendo el tiempo.

En fín, que en un curso de grado MEDIO me digas que se ponen a enseñar comandos de Batch (e imagino que además evaluarán dicho conocimiento adquirido) me parece algo indignante, tenía que decirlo.






Cita de: alvarillolag en 24 Febrero 2014, 21:01 PMduda que me asalta es sobre la posibilidad de hacer un script que no se pueda cerrar normalmente, es decir que al cerrarlo se reabra y detecte que se ha cerrado para ejecutar una consecuencia. Sé que se puede hacer porque una vez me infectaron con un virus que hacía esto.


1. Batch es lo más básico de todo, es básico y simple, tiene poca utilidad y no se pueden hacer grandes cosas (yo no lo considero ni un lenguaje), batch es programación para novatos, no un lenguaje para grandes expectativas ni mucho menos está pensado para desarrollar juegos o tareas con un cierto grado de complejidad, hazte a la idea ya.


2. El script es símplemente un archivo de texto plano, no puedes manejar ningún evento de cierre del intérprete de lenguaje (quiero decir, de la CMD), no puedes saber si se intenta cerrar, si se ha cerrado, o si se intenta abrir.

Por otro lado hay muchas formas de intentar deducir si el proceso se ha cerrado o se ha matado, por ejemplo monitorizando DESDE OTRO PROCESO (otro script) el estado de ejecución del primer proceso, así pues, si el proceso no se está ejecutando quiere decir que se ha cerrado o se ha matado, es pura lógica, una técnica de deducción, pero no hay que caer en el error de confundir una simple técnica de deducción con cierto grado de eficiencia, con poder determinar a ciencia exacta si un proceso se mató o se cerró, lo que hayas visto en ese virus que comentas, en el caso de ser un Script Batch solo sería una técnica de deducción más, y en el caso de ser un programa compilado segúramente haya interceptado/manejado los eventos de cierre de su formulario para saber si el programa se cierra, y volverse a ejecutar, algo que es muy facil de hacer en cualquier otro lenguaje.
En resumen, lo cierto es que el cierre no es algo que se pueda controlar de forma natural en Batch.


3. Cualquier proceso (en este caso CMD.exe) puede ser matado de forma forzosa, esto quiere decir que el OS no da una razón de cierre al proceso y ...lo mata (no lo cierra), la ejecución termina por completo sin poder realizar una verificación de que el proceso está siendo cerrado por "X" razón. No hay forma de verificar un cierre forzoso, solo se pueden usar técnicas de deducción que al fin y al cabo son solo eso, deducciones ...aunque eficazes, pero óbviamente hablo de otros lenguajes, jamás podrás hacer algo eficiente usando puro Batch.




En Batch, si quieres algo facil podrías hacer es una especie de verificación 'First Run', ya sea mediante una clave almacenada en el Registro de Windows, un archivo de texto, o una variable de entorno, y verificar la existencia del valor de ese parámetro "First Run" al inicio del script, para deducir si fue cerrado o no.

Código (dos) [Seleccionar]
@Echo OFF & TITLE Closable-Script

If "%IsFirstRun%" EQU "" (
SETX "IsFirstRun" "True" 1>NUL
Echo Esta es la primera ejecución del Script.

) Else (
Echo Esta no es la primera ejecución del Script.

)

Pause&Exit




Si quieres algo más complejo, puedes generar un script secundario al inicio de tu script, un script secundario con las instrucciones necesarias que se encargaría de comprobar el handle y el título de la ventana del proceso que ejecutó tu primer script para comprobar cada "X" segundos si ese proceso sigue ejecutándose o no (lo que comenté en el punto nº2), es una técnica de deducción sencilla, pero esto no puedes hacerlo de forma nativa en Batch ya que ni el comando WMIC no te muestran los títulos de cada ventana así que necesitarías recurrir a aplicaciones de terceros (Ej: CMDOW) para obtener esa información, es una pérdida de tiempo.




Este script requiere la aplicación externa CMDOW, aunque podrías hacer lo mismo con el comando Tasklist de Batch, o con una query de WMI usando VBS, pero he preferido usar CMDOW porque el comando TaskList tiene un retardo aproximado de 10 segundos (lo que tarda en actualizarse) y para no complicar más el código al hacerlo más híbrido de lo que ya es con esa instrucción que escribí de VBS.

@Echo OFF & TITLE Unclosable-Script

:: By Elektro


REM La ubicación del script temporal que servirá como monitorizador de este script.
Set "MonitorFilepath=%TEMP%\CMDMonitor.cmd"

REM Si no existe el script monitor, lo creo y lo ejecuto...
If Not exist "%MonitorFilepath%" (
Call :StartMonitorScript "%~0"
)


REM Ya estamos listos para jugar.
Echo Intenta cerrarme! :D   | MORE
Echo Intento de cierres: %1 | MORE
Pause&Exit



REM Métodos
:StartMonitorScript
(
Echo @Echo OFF ^& Title CMD Monitor
Echo REM El resultado del monitor. ^(0=False, 1=True^)
Echo Set /A "ProcessIsTerminated=0"
Echo Set /A "ClosingCount=0"
Echo+
Echo :MonitorLoop
Echo CMDOW.exe ^| Find /I "Unclosable-Script" ^&^& ^(
Echo Set /A "ProcessIsTerminated=0"
Echo ^) ^|^| ^(
Echo Set /A "ProcessIsTerminated=1"
Echo   Set /A "ClosingCount+=1"
Echo ^)
Echo+
Echo If %%ProcessIsTerminated%% EQU 1 ^(
Echo Start "Reinitialize Unclosable-Script" CMD.exe /K %* %%ClosingCount%%
Echo ^)
Echo+
Echo Ping.exe -n 2 LocalHost 1^>NUL
Echo Goto :MonitorLoop
)>"%MonitorFilepath%"

(
Echo WScript.CreateObject^("WScript.Shell"^).Run """%MonitorFilepath%""", 0, False
)>"%MonitorFilepath%.vbs"

Start /B "Run Hidden" WScript.exe "%MonitorFilepath%.vbs"

Goto:EOF




De todas formas pienso que deberías invertir tu tiempo en cosas más productivas, en un lenguaje de verdad ...al menos para llevar a cabo este tipo de tareas, batch está bien para automatizar tareas cotidianas del PC, pero nada más.


Un saludo!
#7249
Si devuelve Falso es porque no eres Admin, quizás sólamente eres usuario con privilegios elevados, pero no Administrador.

PD: Yo uso Windows 8.

Saludos
#7250
String Is Numeric Of DataType?

La típica función para comprobar si un String es numérico, reinventada para cumplir dos tareas en una, comprueba si un string es un valor numérico de un tipo específico.

Código (vbnet) [Seleccionar]
   ' String Is Numeric Of Type?
   ' ( By Elektro )
   '
   ' Usage Examples:
   ' MsgBox(StringIsNumeric(Of Long)("50.1")) ' Result: False (it's a Double).
   ' MsgBox(StringIsNumeric(Of Integer)("9999999999")) ' Result: False (it's a Long).
   ' MsgBox(StringIsNumeric(Of Integer)(CStr(Integer.MaxValue))) ' Result: True.
   '
   ''' <summary>
   ''' Determines whether an String is a valid numeric value of the specified type.
   ''' </summary>
   ''' <typeparam name="T">Indicates the numeric DataType</typeparam>
   ''' <param name="Value">Indicates the string value.</param>
   ''' <returns>
   ''' <c>true</c> if string is a valid numeric value of the specified type, <c>false</c> otherwise.
   ''' </returns>
   ''' <exception cref="Exception"></exception>
   Private Function StringIsNumeric(Of T)(ByVal Value As String) As Boolean

       Const MethodName As String = "TryParse"
       Dim DataType As Type = GetType(T)
       Dim Result As Object = Nothing

       Dim Method As System.Reflection.MethodInfo =
       DataType.GetMethod(MethodName,
                          System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Static,
                          Type.DefaultBinder,
                          New Type() {GetType(String), DataType.MakeByRefType()},
                          New System.Reflection.ParameterModifier() {Nothing})

       If Method IsNot Nothing Then
           Return Method.Invoke(Nothing,
                                System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Static,
                                Type.DefaultBinder,
                                New Object() {Value, Result},
                                System.Globalization.CultureInfo.InvariantCulture)

       Else
           Throw New Exception(String.Format("Static method '{0}' not found in '{1}' Type.",
                                             MethodName, DataType.Name))
           Return False

       End If

   End Function