none
Ejecutar .bat desde recursos RRS feed

  • Pregunta

  • Hola,

    Intento ejecutar un .bat desde un boton de windowsform desde los recursos.

    Si especifico una ruta exacta se ejecuta sin problema, pero si lo adjunto a los recursos no se como hacerlo ejecutar.


    davidd88

    sábado, 12 de abril de 2014 14:31

Respuestas

  • "davidd88" preguntó:

    > No entiendo como pasar el recurso a una carpeta fisica y ejecutarlo-
    >
    >  Process.Start(_textStreamReader)'ERROR: Error de resolución de sobrecarga
    >                                          porque ninguna de las funciones 'Start'
    >                                          a las que se tiene acceso se puede llamar
    >                                          con estos argumentos

    Creo que el motivo del error está bastante claro, y se debe a que al método Start de la clase Process no le puedes especificar cualquier cosa, ya que necesariamente tendrás que especificarle la ruta completa donde se encuentra el archivo *.bat.

    Suponiendo que el archivo *.bat lo has añadido a tu proyecto como un Recurso incrustado, tal y como muestra la siguiente imagen


    lo guardarías en la carpeta que contiene el ejecutable de tu aplicación como indico a continuación:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' El archivo *.bat lo guardaremos en la misma carpeta
            ' que contiene el ejecutable de nuestra aplicación.
            '
            Dim fileName As String = IO.Path.Combine(Application.StartupPath, "Test.bat")
    
            Try
                ' Obtenemos el ensamblado que contiene el código
                ' que se está ejecutando actualmente.
                Dim asm As Assembly = Assembly.GetExecutingAssembly()
    
                ' Obtenemos el archivo incrustado en el proyecto.
                '
                Using st As IO.Stream = asm.GetManifestResourceStream("Prueba.Test.bat")
    
                    Dim length As Integer = CInt(st.Length)
                    Dim buffer(length - 1) As Byte
    
                    ' Leemos el contenido del archivo.
                    st.Read(buffer, 0, length)
    
                    ' Procedemos a crear el archivo Test.bat en la misma carpeta
                    ' que contiene el ejecutable de la aplicación.
                    '
                    Using fs As New IO.FileStream(fileName, IO.FileMode.Create)
                        fs.Write(buffer, 0, buffer.Length)
                    End Using
    
                End Using
    
                ' Si se ha creado el archivo *.bat, procedemos a ejecutarlo.
                '
                If (IO.File.Exists(fileName)) Then
                    Process.Start(fileName)
                End If
    
            Catch ex As Exception
                ' Se ha producido un error.
                MessageBox.Show(ex.Message)
    
            End Try

    Fíjate en la siguiente línea:

            ' Obtenemos el archivo incrustado en el proyecto.
            '
            Using st As IO.Stream = asm.GetManifestResourceStream("Prueba.Test.bat")

    Tienes que respetar el nombre de mayúsculas y minúsculas, tanto del ensamblado (Prueba) como del nombre del archivo incrustado (Test.bat), porque de lo contrario no podrás referenciar el archivo incrustado, obteniendo el error oportuno en tiempo de ejecución. Quiere esto decir que si el nombre del archivo incrustado está en mayúsculas, tendrás que referenciarlo así:

            Using st As IO.Stream = asm.GetManifestResourceStream("Prueba.TEST.BAT")

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 15 de abril de 2014 9:46
    Moderador
  • hola

    vas a tener que llevar ese .bat que tienes como recurso a un fisico en alguna carpeta temporal para poder ejecutarlos con el 

    Process.Start()

    ejecutar un archivo .bat

    para bajar el recurso a un archivo

    Cómo incrustar y tener acceso a recursos mediante Visual Basic .NET o Visual Basic 2005

    la idea es que desde el assemby recuperes el archivo y lo lleves a un archvo fisico para ejecutar desde alli

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 12 de abril de 2014 15:13
  • "luisgigo" escribió:

    > Dim asm As Assembly = Assembly.GetExecutingAssembly()
    >
    > Me aparece el error de que Assembly no esta declarado, lo estoy haciendo
    > en VS 2017, alguna recomendacion?

    Sí, que al comienzo del formulario, módulo o clase donde esté incluida la línea, tienes que importar el siguiente espacio de nombres:

        Imports System.Reflection

    O también puedes ejecutar el código de esta manera:

        Dim asm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    jueves, 29 de marzo de 2018 5:44
    Moderador

Todas las respuestas

  • hola

    vas a tener que llevar ese .bat que tienes como recurso a un fisico en alguna carpeta temporal para poder ejecutarlos con el 

    Process.Start()

    ejecutar un archivo .bat

    para bajar el recurso a un archivo

    Cómo incrustar y tener acceso a recursos mediante Visual Basic .NET o Visual Basic 2005

    la idea es que desde el assemby recuperes el archivo y lo lleves a un archvo fisico para ejecutar desde alli

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 12 de abril de 2014 15:13
  • Imports System.IO
    Imports System.Reflection
    Public Class Form1
        
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        Dim _assembly As [Assembly]
        Dim _textStreamReader As StreamReader
            _assembly = [Assembly].GetExecutingAssembly()
            _textStreamReader = New StreamReader(_assembly.GetManifestResourceStream("Prueba.TEST.bat"))
            Process.Start(_textStreamReader)'ERROR: Error	1	Error de resolución de sobrecarga porque ninguna de las funciones 'Start' a las que se tiene acceso se puede llamar con estos argumentos
       
        End Sub
    End Class
    No entiendo como pasar el recurso a una carpeta fisica y ejecutarlo-

    davidd88

    sábado, 12 de abril de 2014 15:45
  • "davidd88" preguntó:

    > No entiendo como pasar el recurso a una carpeta fisica y ejecutarlo-
    >
    >  Process.Start(_textStreamReader)'ERROR: Error de resolución de sobrecarga
    >                                          porque ninguna de las funciones 'Start'
    >                                          a las que se tiene acceso se puede llamar
    >                                          con estos argumentos

    Creo que el motivo del error está bastante claro, y se debe a que al método Start de la clase Process no le puedes especificar cualquier cosa, ya que necesariamente tendrás que especificarle la ruta completa donde se encuentra el archivo *.bat.

    Suponiendo que el archivo *.bat lo has añadido a tu proyecto como un Recurso incrustado, tal y como muestra la siguiente imagen


    lo guardarías en la carpeta que contiene el ejecutable de tu aplicación como indico a continuación:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' El archivo *.bat lo guardaremos en la misma carpeta
            ' que contiene el ejecutable de nuestra aplicación.
            '
            Dim fileName As String = IO.Path.Combine(Application.StartupPath, "Test.bat")
    
            Try
                ' Obtenemos el ensamblado que contiene el código
                ' que se está ejecutando actualmente.
                Dim asm As Assembly = Assembly.GetExecutingAssembly()
    
                ' Obtenemos el archivo incrustado en el proyecto.
                '
                Using st As IO.Stream = asm.GetManifestResourceStream("Prueba.Test.bat")
    
                    Dim length As Integer = CInt(st.Length)
                    Dim buffer(length - 1) As Byte
    
                    ' Leemos el contenido del archivo.
                    st.Read(buffer, 0, length)
    
                    ' Procedemos a crear el archivo Test.bat en la misma carpeta
                    ' que contiene el ejecutable de la aplicación.
                    '
                    Using fs As New IO.FileStream(fileName, IO.FileMode.Create)
                        fs.Write(buffer, 0, buffer.Length)
                    End Using
    
                End Using
    
                ' Si se ha creado el archivo *.bat, procedemos a ejecutarlo.
                '
                If (IO.File.Exists(fileName)) Then
                    Process.Start(fileName)
                End If
    
            Catch ex As Exception
                ' Se ha producido un error.
                MessageBox.Show(ex.Message)
    
            End Try

    Fíjate en la siguiente línea:

            ' Obtenemos el archivo incrustado en el proyecto.
            '
            Using st As IO.Stream = asm.GetManifestResourceStream("Prueba.Test.bat")

    Tienes que respetar el nombre de mayúsculas y minúsculas, tanto del ensamblado (Prueba) como del nombre del archivo incrustado (Test.bat), porque de lo contrario no podrás referenciar el archivo incrustado, obteniendo el error oportuno en tiempo de ejecución. Quiere esto decir que si el nombre del archivo incrustado está en mayúsculas, tendrás que referenciarlo así:

            Using st As IO.Stream = asm.GetManifestResourceStream("Prueba.TEST.BAT")

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    martes, 15 de abril de 2014 9:46
    Moderador
  • Hola recurri a este codigo que pones para ejecutar un bat pero en la linea 

    Dim asm As Assembly = Assembly.GetExecutingAssembly()

    Me aparece el error de que Assembly no esta declarado, lo estoy haciendo en VS 2017, alguna recomendacion?

    miércoles, 28 de marzo de 2018 16:24
  • "luisgigo" escribió:

    > Dim asm As Assembly = Assembly.GetExecutingAssembly()
    >
    > Me aparece el error de que Assembly no esta declarado, lo estoy haciendo
    > en VS 2017, alguna recomendacion?

    Sí, que al comienzo del formulario, módulo o clase donde esté incluida la línea, tienes que importar el siguiente espacio de nombres:

        Imports System.Reflection

    O también puedes ejecutar el código de esta manera:

        Dim asm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    jueves, 29 de marzo de 2018 5:44
    Moderador