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

#7701
Scripting / Re: Sobre archivos .Bat
22 Noviembre 2013, 16:23 PM
Código (dos) [Seleccionar]
@Echo OFF

:Loop

For /F "Tokens=1,*" %%x in (
'fsutil fsinfo drives'
) Do (
Set "Drives=%%y"
)

For %%# in (%DRIVES%) Do (
fsutil fsinfo drivetype %%# | (
Find /I "xtra" 1>NUL 2>&1
) && (
Call :Action "%%#"
)
)
:: Timeout /T 1
Goto :Loop

:Action
Echo Unidad extraible encontrada: "%~1"
:: Hacer algo con la unidad encontrada...
Goto:EOF


PD: También puedes hacerlo filtrando la salida del comando WMIC.

saludos
#7702
Un ejemplo de uso de la librería DiffLib http://difflib.codeplex.com/releases/view/57226
Para comparar texto.



Código (vbnet) [Seleccionar]
' [ DiffLib Examples ]
'
' // By Elektro H@cker
'
' Instructions:
'
' 1. Reference the "DiffLib.dll" into the project.


#Region " DiffLib Examples "

Public Class Form1

   ReadOnly text1 As String = "This is a test of the Diff implementation, with some text that is deleted."
   ReadOnly text2 As String = "This is another test of the same implementation, with some more text."

   Private Sub Test()

       HtmlLabel1.Text = DumpDiff(New DiffLib.Diff(Of Char)(text1, text2),
                                  KnownColor.Black,
                                  KnownColor.Black,
                                  KnownColor.Black,
                                  KnownColor.Transparent,
                                  KnownColor.YellowGreen,
                                  KnownColor.Red,
                                  13)

   End Sub

   Private Function DumpDiff(ByVal changes As IEnumerable(Of DiffLib.DiffChange),
                             ByVal Forecolor As KnownColor,
                             ByVal ForecolorAdded As KnownColor,
                             ByVal ForecolorDeleted As KnownColor,
                             ByVal BackColor As KnownColor,
                             ByVal BackColorAdded As KnownColor,
                             ByVal BackColorDeleted As KnownColor,
                             Optional ByVal FontSize As Integer = 10) As String

       Dim html As New System.Text.StringBuilder()

       Dim i1 As Integer = 0
       Dim i2 As Integer = 0

       For Each change As DiffLib.DiffChange In changes

           If change.Equal Then


               html.Append(String.Format("<span style='color: {0}; background-color: {1}; font-size: {2}pt'>{3}</span>",
                                         Forecolor.ToString,
                                         BackColor.ToString,
                                         CStr(FontSize),
                                         text1.Substring(i1, change.Length1)))

           Else

               html.Append(String.Format("<span style='color: {0}; background-color: {1}; font-size: {2}pt; text-decoration: line-through;'>{3}</span>",
                                        ForecolorDeleted.ToString,
                                        BackColorDeleted.ToString,
                                         CStr(FontSize),
                                        text1.Substring(i1, change.Length1)))

               html.Append(String.Format("<span style='color: {0}; background-color: {1}; font-size: {2}pt'>{3}</span>",
                                        ForecolorAdded.ToString,
                                        BackColorAdded.ToString,
                                         CStr(FontSize),
                                        text2.Substring(i2, change.Length2)))

           End If

           i1 += change.Length1
           i2 += change.Length2

       Next change

       Return html.ToString

   End Function

End Class

#End Region
#7703
@Xpolze

Busca antes de preguntar

En consola:

XCopy /?

Cita de: Xcopy Help  /Y           Suprime la petición de confirmación de sobrescritura de un archivo de destino existente.
 /-Y          Pide confirmación de sobrescritura de un archivo de destino existente.

Saludos!
#7704
Hola

No hagas triple post, debes respetar las normas del foro, usa el botón modificar la próxima vez.

Cita de: Yaldabaot en 21 Noviembre 2013, 20:15 PM
¿Existe alguna manera de empezar en el segundo elemento en un for each?

Puedes utilizar LINQ:

Código (vbnet) [Seleccionar]
   Dim arr As String() = {"1", "2", "3", "4", "5"}

   For Each str As String In arr.Skip(1)
       MsgBox(str) ' Empieza por "2"
   Next


http://msdn.microsoft.com/en-us/library/bb358985%28v=vs.110%29.aspx

saludos
#7705
1. la información que das está bien pero... ¿en que linea exáctamente se da la excepción?, al usar el método delete?, o es por un índice fuera de rango?.

2. ¿Que necesidad hay de usar dos ciclos pudiendo usar uno?, ya tienes una colección de objetos, usa un for each en lugar de un for range.

3. has intentado debugearlo?

Yo no manejo estas cosas de Excel pero creo que lo primero de todo deberías empezar por usar un solo búcle, y luego ya, localizar e intentar reparar el error, prueba algo así:

Código (vbnet) [Seleccionar]
'Obtiene la cantidad de hojas a borrar
'dim cantidad as integer = xlWorkBook.Worksheets.Count ?

For Each sheet As Excel.Worksheet In xlWorkBook.Worksheets
 try
   sheet.delete()
 catch ex as exception
   msgbox(ex.message & ex.stacktrace)
 end try
Next sheet
#7706
Desactivar la redimensión (resize) para ciertos lados del Form (izquierda, derecha, arriba, abajo, o esquinas...)

Código (vbnet) [Seleccionar]
#Region " Form Resize Disabler "

   ' [ Form Resize Disabler ]
   '
   ' Examples:
   ' Me.EnableResizeBottom = False
   ' Me.EnableResizeTop = False

   Public Property EnableResizeTop As Boolean = True
   Public Property EnableResizeLeft As Boolean = True
   Public Property EnableResizeRight As Boolean = True
   Public Property EnableResizeBottom As Boolean = True
   Public Property EnableResizeTopLeft As Boolean = True
   Public Property EnableResizeTopRight As Boolean = True
   Public Property EnableResizeBottomLeft As Boolean = True
   Public Property EnableResizeBottomRight As Boolean = True

   Private Enum NCHitTest As Integer
       Transparent = -1
       Nowhere = 0
       Client = 1
       Caption = 2
       Left = 10
       Right = 11
       Top = 12
       TopLeft = 13
       TopRight = 14
       Bottom = 15
       BottomLeft = 16
       BottomRight = 17
       Border = 18
   End Enum

   Protected Overrides Sub WndProc(ByRef m As Message)

       MyBase.WndProc(m)

       Select Case m.Msg

           Case &H84 ' WM_NCHITTEST

               Select Case CType(m.Result, NCHitTest)

                   Case NCHitTest.Top
                       If Not Me.EnableResizeTop Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.Left
                       If Not Me.EnableResizeLeft Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.Right
                       If Not Me.EnableResizeRight Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.Bottom
                       If Not Me.EnableResizeBottom Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.TopLeft
                       If Not Me.EnableResizeTopLeft Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.TopRight
                       If Not Me.EnableResizeTopRight Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.BottomLeft
                       If Not Me.EnableResizeBottomLeft Then m.Result = New IntPtr(NCHitTest.Caption)

                   Case NCHitTest.BottomRight
                       If Not Me.EnableResizeBottomRight Then m.Result = New IntPtr(NCHitTest.Caption)

               End Select

       End Select

   End Sub

#End Region


Ejemplo de uso:

Código (vbnet) [Seleccionar]
   Private Sub Form_Shown() Handles MyBase.Shown
       Me.EnableResizeTop = False
       Me.EnableResizeBottom = False
   End Sub
#7707
Ese código (incompleto) es muy vb6 (como todo lo que sueles mostrar hasta ahora), sería mucho mejor que intentes hacerlo por ti mismo usando el estilo .NET, que usar códigos como ese.

Lo mejor es usar un programa que añada el sistema de expiración profesional, pero bueno, toma un ejemplo de una expiración muy sencilla:

Código (vbnet) [Seleccionar]
' [Trial Expiration]
'
' By Elektro H@cker

#Region " Easy Trial Expiration "

Public Class TrialExpiration

#Region " Variables "

   ''' <summary>
   ''' The date that the expiration started.
   ''' </summary>
   Public Property TrialDateStart As New Date(Nothing)

   ''' <summary>
   ''' The date that the expiration ends.
   ''' </summary>
   Public Property TrialDateEnd As New Date(Nothing)

   ''' <summary>
   ''' Expiration days.
   ''' </summary>
   Public Property TrialDays As Integer = 0

   ''' <summary>
   ''' Expiration days left.
   ''' </summary>
   Public Property DaysLeft As Integer = 0

   ''' <summary>
   ''' Indicates wether the expiration has expired.
   ''' </summary>
   Public Property IsExpired As Boolean = False

    ''' <summary>
    ''' Indicates the application compiled executable name to avoid the user renaming the file.
    ''' </summary>
    Private EXEname As String = String.Empty

#End Region

#Region " Constructor "

   ''' <summary>
   ''' Creates a new Trial Expiration.
   ''' </summary>
   ''' <param name="EXEname">
   ''' The application compiled executable name.
   ''' This way if the compiled executable name is manipulated by the user, an expired case will be trhown.
   ''' </param>
   ''' <param name="TrialDays">
   ''' Amount of days to expire.
   ''' </param>
   Public Sub New(ByVal EXEname As String, ByVal TrialDays As Integer)
       EXEname = EXEname
       Me.TrialDays = TrialDays
       SetTrialDates()
       GetDaysLeft()
   End Sub

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Resets the Trial Expiration.
   ''' </summary>
   Public Sub Reset()
       My.Settings.TrialDate = String.Empty
       My.Settings.Save()
       '  My.Settings.Reload()
   End Sub

#End Region

#Region " Private Methods "

   Private Sub SetTrialDates()

       ' If it's application first time run then set the initial date as Today.
       If String.IsNullOrEmpty(My.Settings.TrialDate) Then
           My.Settings.TrialDate = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(Today.ToString))
           My.Settings.Save()
           My.Settings.Reload()
       End If

       Try
           TrialDateStart = Date.Parse(System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(My.Settings.TrialDate)))
       Catch ex As FormatException
           ' Exception thrown if the user has corrupted the base64 string from the settings file.
           ' Then truncates the initial date to force trial expiration.
           TrialDateStart = Date.Parse("0001/01/01")
       End Try

       TrialDateEnd = TrialDateStart.AddDays(Me.TrialDays)

   End Sub

   Private Sub GetDaysLeft()

       Me.DaysLeft = (DateTime.Now.Subtract(Today) - DateTime.Now.Subtract(TrialDateEnd)).Days

       Me.IsExpired = (Me.DaysLeft <= 0 _
                       OrElse Today < TrialDateStart _
                       OrElse Not String.Compare(Process.GetCurrentProcess().MainModule.ModuleName, EXEname, True) = 0)

       ' "OrElse Today < TrialDateStart" explanation:
       ' If the user has manipulated te Windows OS date.
       ' OrElse Process.GetCurrentProcess().MainModule.ModuleName <> EXEname

   End Sub

#End Region

End Class

#End Region


Código (vbnet) [Seleccionar]
Public Class Form1

   Private WithEvents _Trial As New TrialExpiration("WindowsApplication1.exe", 7)

   Private Shadows Sub Shown() Handles MyBase.Shown

       ' _Trial.Reset()

       Select Case _Trial.IsExpired

           Case True
               MsgBox(String.Format("Your copy of this software has expired on {0}.",
                                    _Trial.TrialDateEnd.ToString))

           Case False
               MsgBox(String.Format("You have {0} expiration remaining days.",
                                    CStr(_Trial.DaysLeft)))

       End Select

   End Sub

End Class


Debes añadir una nueva setting llamada "TrialDate" de tipo String y de scope "User".

Saludos.
#7708
Otro ayudante más, en esta ocasión es para la aplicación FFMPEG,
no le añadí ningún método para convertir video (pero si uno para el audio) ya que no necesito convertir la pista de video, pero el código es facil de extender, solo hay que seguir el ejemplo del audio.

PD: Existen varios wrappers de FFMPEG para .NET, pero... todos obsoletos, en C#, y no he visto ninguno que tenga un triste evento al que subscribirse.





Código (vbnet) [Seleccionar]



' [ FFMPEG Helper ]
'
' // By Elektro H@cker
'
' Instructions:
'
' 1. Add the "FFMPEG.exe" into the project


#Region " FFMPEG Helper "

#Region " Usage Examples "

'Public Class Form1

'    Private WithEvents _FFMPEG As New FFMPEG With
'    {.FFMPEG_location = "C:\windows\system32\ffmpeg.exe", .CheckFileExist = False}

'    Private Shadows Sub Shown() Handles MyBase.Shown

'        ' Checks if FFMPEG executable is avaliable.
'        MsgBox(_FFMPEG.Is_Avaliable())

'        ' Checks if a video has metadata
'        MsgBox(_FFMPEG.HasMetadata("C:\Video.mkv"))

'        ' Remove metadata from video
'        _FFMPEG.RemoveMetadata("C:\Input.mkv", "C:\Output.mkv", True, 4)

'        ' reCompress the audio track of a video
'        _FFMPEG.Recompress_AudioTrack("C:\Input.mkv", "C:\Output.mkv", True,
'                                      FFMPEG.AudioCodec.libmp3lame, FFMPEG.AudioBitRate.kbps_128, 4)

'    End Sub

'    ' FFMPEG [Started]
'    Private Sub FFMPEG_Started(ByVal sender As Process, ByVal e As FFMPEG.StartedEventArgs) _
'    Handles _FFMPEG.Started

'        ProgressBar1.Value = ProgressBar1.Minimum

'        Dim sb As New System.Text.StringBuilder

'        sb.AppendLine(String.Format("Started an ""{0}"" operation", e.Operation.ToString))
'        sb.AppendLine(String.Format("Input file is: ""{0}""", e.File))
'        sb.AppendLine(String.Format("FFMPEG process PID is: ""{0}""", CStr(sender.Id)))

'        MessageBox.Show(sb.ToString, "FFMPEG", MessageBoxButtons.OK, MessageBoxIcon.Information)

'    End Sub

'    ' FFMPEG [Exited]
'    Private Sub FFMPEG_Exited(ByVal sender As Process, ByVal e As FFMPEG.ExitedEventArgs) _
'    Handles _FFMPEG.Exited

'        Dim sb As New System.Text.StringBuilder

'        sb.AppendLine(String.Format("Finished an ""{0}"" operation", e.Operation.ToString))
'        sb.AppendLine(String.Format("Input file is: ""{0}""", e.File))
'        sb.AppendLine(String.Format("FFMPEG process PID is: {0}", CStr(sender.Id)))

'        If e.Errors.Count <> 0 Then
'            sb.AppendLine(String.Format("Errors during operation: {0}", String.Join(Environment.NewLine, e.Errors)))
'        End If

'        MessageBox.Show(sb.ToString, "FFMPEG", MessageBoxButtons.OK, MessageBoxIcon.Information)

'    End Sub

'    ' FFMPEG [Progress]
'    Private Sub FFMPEG_Progress(sender As Process, e As FFMPEG.ProgressEventArgs) _
'    Handles _FFMPEG.Progress

'        ProgressBar1.Value = e.Percent

'        Label1.Text = "Percent Done: " & CStr(e.Percent) & "%"
'        Label2.Text = "Video Duration: " & e.VideoDuration.ToString("hh\:mm\:ss")
'        Label3.Text = "Written Duration: " & e.Time.ToString("hh\:mm\:ss")
'        Label4.Text = "Written Data: " & (e.WrittenBytes / 1024L * 1024L).ToString("n1") & "MB"

'    End Sub

'End Class

#End Region

#Region " CommandLine Parameter legend "

'-y        | Overwrite output files without asking.
'-n        | Do not overwrite output files, and exit immediately if a specified output file already exists.
'-threads: |  Specify the cpu threads to use.
'-nostdin  | Disable interaction on standard input.
'-vcodec   | Set the video codec.
'-acodec   | Set the audio codec.
'-vn       | Disable video recording.
'-an       | Disable audio recording.

' -c copy -map_metadata -1
' Don't add metadata.

#End Region

Public Class FFMPEG : Implements IDisposable

#Region " Variables, Properties, Enumerations "

   ''' <summary>
   ''' Gets or sets FFMPEG.exe executable path.
   ''' </summary>
   Public Property FFMPEG_location As String = ".\FFMPEG.exe"

   ''' <summary>
   ''' Unique temp file to write FFMPEG output.
   ''' </summary>
   Private ReadOnly TempFile As String = IO.Path.GetTempFileName

   ''' <summary>
   ''' Indicates if should check that the file exist before realize an operation.
   ''' If True, an exception would be launched if file does not exist.
   ''' </summary>
   Public Property CheckFileExist As Boolean = False

   ''' <summary>
   ''' Stores the next FFMEP process output line.
   ''' </summary>
   Private OutputLine As String = Nothing

   ''' <summary>
   ''' Stores the Video Duration.
   ''' </summary>
   Private VideoDuration As TimeSpan = Nothing

   ''' <summary>
   ''' Stores the processed video time.
   ''' </summary>
   Private Time As TimeSpan = Nothing

   ''' <summary>
   ''' Stores the conversion errors (if any).
   ''' </summary>
   Private Errors As New List(Of String)

   ''' <summary>
   ''' Stores the StartedEventArgs Arguments.
   ''' </summary>
   Private StartedArgs As New StartedEventArgs

   ''' <summary>
   ''' Stores the ExitedEventArgs Arguments.
   ''' </summary>
   Private ExitedArgs As New ExitedEventArgs

   ''' <summary>
   ''' Stores the ProgressEventArgs Arguments.
   ''' </summary>
   Private ProgressArgs As New ProgressEventArgs

   ''' <summary>
   ''' FFMPEG kind Of Operation.
   ''' </summary>
   Public Enum Operation As Short
       Check_Metadata = 0
       Remove_Metadata = 1
       Recompress_AudioTrack = 2
   End Enum

   ''' <summary>
   ''' FFMPEG Process.
   ''' </summary>
   Private p As Process =
       New Process With {.StartInfo =
           New ProcessStartInfo With {
               .CreateNoWindow = True, _
               .UseShellExecute = False, _
               .RedirectStandardError = True, _
               .RedirectStandardOutput = True, _
               .StandardErrorEncoding = System.Text.Encoding.Default, _
               .StandardOutputEncoding = System.Text.Encoding.Default
          }
       }

   ''' <summary>
   ''' Audio Codec use for the conversion.
   ''' </summary>
   Public Enum AudioCodec

       ''' <summary>
       ''' MP3 Audio.
       ''' </summary>
       libmp3lame

       ''' <summary>
       ''' Windows Media Audio.
       ''' </summary>
       wmav2

   End Enum

   ''' <summary>
   ''' BitRate used for the audio compression.
   ''' </summary>
   Public Enum AudioBitRate As Integer
       kbps_24 = 24
       kbps_32 = 32
       kbps_40 = 40
       kbps_48 = 48
       kbps_56 = 56
       kbps_64 = 64
       kbps_80 = 80
       kbps_96 = 96
       kbps_112 = 112
       kbps_128 = 128
       kbps_144 = 144
       kbps_160 = 160
       kbps_192 = 192
       kbps_224 = 224
       kbps_256 = 256
       kbps_320 = 320
   End Enum

#End Region

#Region " Events "

   ''' <summary>
   ''' Event raised when FFMPEG operation progress changes.
   ''' </summary>
   Public Event Progress As EventHandler(Of ProgressEventArgs)
   Public Class ProgressEventArgs : Inherits EventArgs

       ''' <summary>
       ''' The FFMPEG operation percent done.
       ''' </summary>
       Public Property Percent As Integer

       ''' <summary>
       ''' The Input Video Duration.
       ''' </summary>
       Public Property VideoDuration As TimeSpan

       ''' <summary>
       ''' The processed video time.
       ''' </summary>
       Public Property Time As TimeSpan

       ''' <summary>
       ''' The total amount of written bytes.
       ''' </summary>
       Public Property WrittenBytes As Double

   End Class

   ''' <summary>
   ''' Event raised when FFMPEG process has started.
   ''' </summary>
   Public Event Started As EventHandler(Of StartedEventArgs)
   Public Class StartedEventArgs : Inherits EventArgs

       ''' <summary>
       ''' Gets the file that was passed as argument to the process.
       ''' </summary>
       Public Property File As String

       ''' <summary>
       ''' Gets the type of operation to realize.
       ''' </summary>
       Public Property Operation As Operation

   End Class

   ''' <summary>
   ''' Event raised when FFMPEG process has exited.
   ''' </summary>
   Public Event Exited As EventHandler(Of ExitedEventArgs)
   Public Class ExitedEventArgs : Inherits EventArgs

       ''' <summary>
       ''' Gets the file that was passed as argument to the process.
       ''' </summary>
       Public Property File As String

       ''' <summary>
       ''' Gets the type of operation to realize.
       ''' </summary>
       Public Property Operation As Operation

       ''' <summary>
       ''' Gets an error message of the realized operation (if any).
       ''' </summary>
       Public Property Errors As List(Of String)

   End Class

#End Region

#Region " Public Methods "

   ''' <summary>
   ''' Checks if FFMPEG process is avaliable.
   ''' </summary>
   Public Function Is_Avaliable() As Boolean
       Return IO.File.Exists(Me.FFMPEG_location)
   End Function

   ''' <summary>
   ''' Checks if a video file contains metadata fields.
   ''' </summary>
   Public Function HasMetadata(ByVal VideoFile As String) As Boolean

       DisposedCheck()

       p.StartInfo.Arguments =
         String.Format("-y -i ""{0}"" -f ffmetadata ""{1}""",
                       VideoFile,
                       TempFile)

       Run_FFMPEG(VideoFile, Operation.Check_Metadata)

       Return IO.File.ReadAllText(TempFile).Replace(";FFMETADATA1", "").Trim.Length <> 0

   End Function

   ''' <summary>
   ''' Removes the metadata tags from a video file.
   ''' </summary>
   Public Sub RemoveMetadata(ByVal VideoFile As String,
                             ByVal OutputFile As String,
                             ByVal OverWrite As Boolean,
                             Optional ByVal Threads As Integer = 1)

       DisposedCheck()

       p.StartInfo.Arguments =
         String.Format("-nostdin -threads {2} {3} -i ""{0}"" -c copy -map_metadata -1 ""{1}""",
                       VideoFile,
                       OutputFile,
                       Threads,
                       If(OverWrite, "-y", "-n"))

       Run_FFMPEG(VideoFile, Operation.Remove_Metadata)

   End Sub

   ''' <summary>
   ''' ReCompress the audio track of a video file.
   ''' </summary>
   Public Sub Recompress_AudioTrack(ByVal VideoFile As String,
                                    ByVal OutputFile As String,
                                    ByVal OverWrite As Boolean,
                                    ByVal AudioCodec As AudioCodec,
                                    ByVal Bitrate As AudioBitRate,
                                    Optional ByVal CopyMetadata As Boolean = False,
                                    Optional ByVal Threads As Integer = 1)

       DisposedCheck()

       p.StartInfo.Arguments =
         String.Format("-nostdin -threads {2} {3} -i ""{0}"" {6} -vcodec copy -acodec {4} -ab {5} ""{1}""",
                       VideoFile,
                       OutputFile,
                       Threads,
                       If(OverWrite, "-y", "-n"),
                       AudioCodec.ToString,
                       CStr(Bitrate) & "k",
                       If(CopyMetadata, "", "-c copy -map_metadata -1"))

       Run_FFMPEG(VideoFile, Operation.Recompress_AudioTrack)

   End Sub

#End Region

#Region " Run Method "

   ''' <summary>
   ''' Runs a specific operation of FFMPEG.
   ''' </summary>
   Private Sub Run_FFMPEG(ByVal file As String,
                          ByVal Operation As Operation)

       If Me.CheckFileExist Then
           FileExist(file)
       End If

       VideoDuration = Nothing
       Errors.Clear()

       p.StartInfo.FileName = Me.FFMPEG_location
       p.Start()

       With StartedArgs
           .File = file
           .Operation = Operation
       End With

       RaiseEvent Started(p, StartedArgs)

       While Not p.StandardError.EndOfStream

           ' Parse the Input Video Duration to calculate the percentage.
           Do Until VideoDuration.TotalMilliseconds > 0

               OutputLine = p.StandardError.ReadLine.ToLower

               If OutputLine.Contains("duration") Then

                   Try
                       VideoDuration = TimeSpan.Parse(OutputLine.Replace("duration:", "").
                                                                 Split(",").FirstOrDefault)
                   Catch ex As FormatException
                       VideoDuration = TimeSpan.Parse("24:00:00") ' 00:00:00
                   End Try

               End If
           Loop

           ' Parse the percentage and other values.
           OutputLine = p.StandardError.ReadLine.ToLower

           If OutputLine.StartsWith("frame=") Then

               Time = TimeSpan.Parse(OutputLine.Split("=")(5).Split.First)

               With ProgressArgs
                   .VideoDuration = VideoDuration
                   .Time = Time
                   .Percent = (Time.TotalSeconds / VideoDuration.TotalSeconds) * 100
                   .WrittenBytes = CDbl(OutputLine.Split("=")(4).Trim.Split.First.Replace("kb", "")) / 1024
               End With

               RaiseEvent Progress(p, ProgressArgs)

           ElseIf (OutputLine.Contains("error") OrElse OutputLine.Contains("warning")) Then
               Errors.Add(OutputLine)
#If DEBUG Then
               ' MsgBox("[DEBUG] FFMPEG Error: " & OutputLine)
#End If
           End If

       End While

       With ExitedArgs
           .File = file
           .Operation = Operation
           .Errors = Errors
       End With

       RaiseEvent Exited(p, ExitedArgs)

       ' FFMPEG.Close()

   End Sub

#End Region

#Region " Miscellaneous Methods "

   ''' <summary>
   ''' Checks if a file exists.
   ''' </summary>
   Private Sub FileExist(ByVal File As String)

       If Not IO.File.Exists(File) Then
           ' Throw New Exception("File doesn't exist: " & File)
           MessageBox.Show("File doesn't exist: " & File, "FFMPEG", MessageBoxButtons.OK, MessageBoxIcon.Error)
       End If

   End Sub

#End Region

#Region " IDisposable "

   ''' <summary>
   ''' To detect redundant calls when disposing.
   ''' </summary>
   Private IsDisposed As Boolean = False

   ''' <summary>
   ''' Prevents calls to methods after disposing.
   ''' </summary>
   Private Sub DisposedCheck()
       If Me.IsDisposed Then
           Throw New ObjectDisposedException(Me.GetType().FullName)
       End If
   End Sub

   ''' <summary>
   ''' Disposes the objects generated by this instance.
   ''' </summary>
   Public Sub Dispose() Implements IDisposable.Dispose
       Dispose(True)
       GC.SuppressFinalize(Me)
   End Sub

   ' IDisposable
   Protected Overridable Sub Dispose(IsDisposing As Boolean)

       If Not Me.IsDisposed Then

           If IsDisposing Then
               p.Dispose()
           End If

       End If

       Me.IsDisposed = True

   End Sub

#End Region

End Class

#End Region



Un ejemplo de uso:

Código (vbnet) [Seleccionar]
Public Class Form1

   Private WithEvents _FFMPEG As New FFMPEG With
   {.FFMPEG_location = "C:\windows\system32\ffmpeg.exe", .CheckFileExist = False}

   Private Shadows Sub Shown() Handles MyBase.Shown

       ' Checks if FFMPEG executable is avaliable.
       MsgBox(_FFMPEG.Is_Avaliable())

       ' Checks if a video has metadata
       MsgBox(_FFMPEG.HasMetadata("C:\Video.mkv"))

       ' Remove metadata from video
       _FFMPEG.RemoveMetadata("C:\Input.mkv", "C:\Output.mkv", True, 4)

       ' reCompress the audio track of a video
       _FFMPEG.Recompress_AudioTrack("C:\Input.mkv", "C:\Output.mkv", True,
                                     FFMPEG.AudioCodec.libmp3lame, FFMPEG.AudioBitRate.kbps_128, 4)

   End Sub

   ' FFMPEG [Started]
   Private Sub FFMPEG_Started(ByVal sender As Process, ByVal e As FFMPEG.StartedEventArgs) _
   Handles _FFMPEG.Started

       ProgressBar1.Value = ProgressBar1.Minimum

       Dim sb As New System.Text.StringBuilder

       sb.AppendLine(String.Format("Started an ""{0}"" operation", e.Operation.ToString))
       sb.AppendLine(String.Format("Input file is: ""{0}""", e.File))
       sb.AppendLine(String.Format("FFMPEG process PID is: ""{0}""", CStr(sender.Id)))

       MessageBox.Show(sb.ToString, "FFMPEG", MessageBoxButtons.OK, MessageBoxIcon.Information)

   End Sub

   ' FFMPEG [Exited]
   Private Sub FFMPEG_Exited(ByVal sender As Process, ByVal e As FFMPEG.ExitedEventArgs) _
   Handles _FFMPEG.Exited

       Dim sb As New System.Text.StringBuilder

       sb.AppendLine(String.Format("Finished an ""{0}"" operation", e.Operation.ToString))
       sb.AppendLine(String.Format("Input file is: ""{0}""", e.File))
       sb.AppendLine(String.Format("FFMPEG process PID is: {0}", CStr(sender.Id)))

       If e.Errors.Count <> 0 Then
           sb.AppendLine(String.Format("Errors during operation: {0}", String.Join(Environment.NewLine, e.Errors)))
       End If

       MessageBox.Show(sb.ToString, "FFMPEG", MessageBoxButtons.OK, MessageBoxIcon.Information)

   End Sub

   ' FFMPEG [Progress]
   Private Sub FFMPEG_Progress(sender As Process, e As FFMPEG.ProgressEventArgs) _
   Handles _FFMPEG.Progress

       ProgressBar1.Value = e.Percent

       Label1.Text = "Percent Done: " & CStr(e.Percent) & "%"
       Label2.Text = "Video Duration: " & e.VideoDuration.ToString("hh\:mm\:ss")
       Label3.Text = "Written Duration: " & e.Time.ToString("hh\:mm\:ss")
       Label4.Text = "Written Data: " & (e.WrittenBytes / 1024L * 1024L).ToString("n1") & "MB"

   End Sub

End Class
#7709
Scripting / Re: Problema con un For en batch
20 Noviembre 2013, 13:55 PM
Cita de: santi810 en 20 Noviembre 2013, 11:34 AM
no me funciona porque me pasa las comillas
    no acabo de entender porque pones el:
Echo "%%1=%~1"

Pues lo pongo precísamente para quitar las comillas...  los parámetros incluyen comillas (aunque tu no las veas), entonces debes expandir la variable para evitar los errores de sintaxis.

Aunque no es necesario quitar las comillas, lo que no debes hacer es añadirle ese otro par de comillas de más.

Ejemplos:

Parámetro por defecto, lleva comillas dobles, esto puede provocar errores inesperados de sintaxis por una maña utilización, como te está dando a ti.
Echo %1

Parámetro expandido, es decir, sin comillas, esto puede causar errores de sintaxis si el parámetro contiene espacios en el nombre, pues todo argumento debe estar encerrado en comillas dobles para tratarse corréctamente.
Echo %~1

Parámetro expandido y con comillas, esto ya no puede provocar ningún tipo de error inesperado, siempre que se utilize como es debido.
Echo "%~1"

Parámetro con 4 comillas dobles, sobran los comentarios.
Echo "%1"

Saludos.
#7710
Dios mio!

Vaya animalada de código, si yo fuese el profesor sincéramente no dejaria que el alumno volviese a entrar en clase.

Consejos:

· Evitar cualquier uso de IF anidado de esa manera tan ...exagerada.

· No escribir lineas tan largas que sobrepasen la capacidad de la IDE obligando a usar la scrollbar horizontal, eso no es nada productivo ni eficiente (por no hablar d leos ifs), usa la indentación y la tecla "Intro" o el caracter "_" para truncar una linea larga, que para algo está todo eso.

· Aprovéchate cuanto puedas de las comodidades que ofrecen las extensiones LINQ en lugar de iterar los elementos con un FOR (aunque es mejor un FOR, pero si se trata de simplificar la escritura de código entonces usa LINQ).

· No compliques las cosas más de lo necesario usando arrays dimensionales, no lo necesitas, de hecho cualquier tipo de container está de más para esta tarea, pero si quieres almacenar los numeros en algún sitio para tener algún tipo de conrol sobre ellos, usa un array de toda la vida, no compliques más las cosas.


Ejemplo:

EDITO: mejor elaborado

Código (vbnet) [Seleccionar]
Public Class Form1

   ReadOnly Property Numbers As Integer()
       Get
           Return {
                   CInt(TextBox1.Text), CInt(TextBox2.Text), CInt(TextBox3.Text),
                   CInt(TextBox4.Text), CInt(TextBox5.Text), CInt(TextBox6.Text),
                   CInt(TextBox7.Text), CInt(TextBox8.Text), CInt(TextBox9.Text)
                  }
       End Get
   End Property

   ReadOnly Property Total As Integer
       Get
           Return Numbers().Sum(Function(number) number)
       End Get
   End Property

   ReadOnly Property HasDuplicates As Boolean
       Get
           Return (From i As Integer In Numbers
                   Group By i Into Count()
                   Where Count <> 1).Any
       End Get
   End Property

   Private Shadows Sub Load() Handles MyBase.Load
       TextBox1.Text = CStr(6) : TextBox2.Text = CStr(1) : TextBox3.Text = CStr(8)
       TextBox4.Text = CStr(7) : TextBox5.Text = CStr(5) : TextBox6.Text = CStr(3)
       TextBox7.Text = CStr(2) : TextBox8.Text = CStr(9) : TextBox9.Text = CStr(4)
   End Sub

   Private Sub Button_Click() Handles Button1.Click

       Select Case Total

           Case (15 * 3)
               If HasDuplicates Then
                   MsgBox("No es un cuadro mágico, hay numeros repetidos.")
               Else
                   MsgBox("Es un cuadro mágico.")
               End If

           Case Else
               MsgBox("No es un cuadro mágico, los números de cada columna no suman 15 en su totalidad.")

       End Select

   End Sub

End Class

Saludos.