Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: FOXAR en 2 Marzo 2015, 21:08 pm



Título: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: FOXAR en 2 Marzo 2015, 21:08 pm
hola espero y me puedan ayudar tengo un archivo .bat que me genera una copia de seguridad de mi base de datos y la ejecuto desde mi aplicación en visual bacic, lo que quiero que que me ayuden a como asociar lo que se demora ese archivo ejecutándose con una barra de estado para que el usuario sepa cuando termino la copia de seguridad. de ante mano gracias 


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: engel lex en 2 Marzo 2015, 21:15 pm
el comando retorna algún valor en la consola? si no sería inútil colocar un tiempo fijo porque va a cambiar según procesos tengas abiertos, tamaño de la base, etc...


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: FOXAR en 2 Marzo 2015, 21:19 pm
solo crea la carpeta donde se va a guardar y luego guarda en esa ruta mas no retorna un valor
 


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: Eleкtro en 2 Marzo 2015, 21:20 pm
Buenas

El planteamiento de la aplicación es incorrecta, ya que estás utilizando una herramienta simple de procesamiento por lotes desde un lenguaje de alto nivel.

1. Puedes hacer TODO lo que puedas hacer en Batch, utilizando puro código .Net.

2. Para implementar una barra de progreso a un proceso externo, en este caso CMD, debes utilizar técnicas de IPC (inter-process comunication) para leer el stream de salida de la CMD y tomar como referencia algún indicador que sirva para estimar el porcentaje de progresión.

El caso es que formulas una duda donde está implicado un código Batch pero ni siquiera muestras el contenido del Batch-Script ¿?,
Si en la consola no se muestra ningún tipo de indicador (1%...100% / 1 de 100) entonces olvídate de poder implementar una barra de progreso en tu aplicación de escritorio, a menos que no te importe utilizar una barra de progreso de estado indeterminado (sin mínimo, ni máximo).

Saludos


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: FOXAR en 2 Marzo 2015, 21:26 pm
haaa este es .bat
Código
  1. @echo off
  2. cls
  3.  
  4. IF NOT EXIST "D:\ruta\backup\%date:~6,4%\%date:~3,2%\%date:~0,2%%date:~3,2%%date:~6,4%" MD "D:\ruta\backup\%date:~6,4%\%date:~3,2%\%date:~0,2%%date:~3,2%%date:~6,4%"
  5.  
  6. cd "D:\ruta\backup\%date:~6,4%\%date:~3,2%\%date:~0,2%%date:~3,2%%date:~6,4%"
  7.  
  8.  
  9. SET PGPASSWORD=contraseña
  10. "C:\Archivos de programa\PostgreSQL\9.3\bin\"pg_dump.exe --host localhost --port 5432 --username siscolsi --format custom --blobs --verbose --file "D:\ruta\backup\%date:~6,4%\%date:~3,2%\%date:~0,2%%date:~3,2%%date:~6,4%\basede datos-%date:~0,2%%date:~3,2%%date:~6,4%_%Time:~0,2%HH%Time:~3,2%MM.backup" "nombre del baku"



[MOD]:

espero que me ayuden para poder sincronizarlos
1. Utiliza el botón de insertar código para insertar bloques de código.
2. Publica las preguntas sobre .Net en la sección dedicada a la programación .Net
Lee las normas del foro.


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: Eleкtro en 2 Marzo 2015, 22:37 pm
¿y donde está el código de VB.Net?, aquí no hacemos tareas.

Además desconocemos la salida de dicho proceso "pgdump", y se te han dado indicaciones de lo que debes hacer.

De todas formas te muestro un extenso ejemplo sobre cómo traducir ese batch-script a VB.Net, y cómo leer la salida normal/error de dicho proceso, de forma asíncrona:

Código
  1. Imports System.Globalization
  2. Imports System.IO
  3. Imports System.Text
  4.  
  5. Public Class TestForm
  6.  
  7.    ReadOnly backupDirDateFormat As String =
  8.        Date.Today.ToString("yyyy\\MM\\ddMMyyyy", CultureInfo.InvariantCulture)
  9.  
  10.    ReadOnly dbFilenameDateFormat As String =
  11.        Date.Now.ToString("ddMMyyyy_HH\H\Hmm\M\M", CultureInfo.InvariantCulture)
  12.  
  13.    ReadOnly sourceDir As String = "D:\ruta\backup"
  14.    ReadOnly backupDir As String = Path.Combine(Me.sourceDir, Me.backupDirDateFormat)
  15.    ReadOnly dbSrcFilepath As String = Path.Combine(Me.backupDir, String.Format("basede datos-{0}.backup", Me.dbFilenameDateFormat))
  16.    ReadOnly dbDstFilepath As String = Path.Combine(Application.StartupPath, "Nombre del backup")
  17.  
  18.    ReadOnly pgFilepath As String = "C:\Archivos de programa\PostgreSQL\9.3\bin\pg_dump.exe"
  19.    ReadOnly pgPassword As String = String.Empty
  20.    ReadOnly pgArgsFormat As String =
  21.        <a>--host "localhost" --port "5432" --username "siscolsi" --format "custom" --blobs --verbose --file "{0}" "{1}"</a>.Value
  22.  
  23.    Private WithEvents pgProcess As New Process With
  24.        {
  25.            .EnableRaisingEvents = True,
  26.            .StartInfo = New ProcessStartInfo With
  27.                         {
  28.                             .FileName = Me.pgFilepath,
  29.                             .Arguments = String.Format(Me.pgArgsFormat, Me.dbSrcFilepath, Me.dbDstFilepath),
  30.                             .CreateNoWindow = False,
  31.                             .RedirectStandardError = True,
  32.                             .RedirectStandardOutput = True,
  33.                             .StandardErrorEncoding = Encoding.Default,
  34.                             .StandardOutputEncoding = Encoding.Default,
  35.                             .UseShellExecute = False,
  36.                             .WindowStyle = ProcessWindowStyle.Hidden,
  37.                             .WorkingDirectory = Application.StartupPath
  38.                         }
  39.        }
  40.  
  41.    Private Sub TestForm_Load() _
  42.    Handles MyBase.Load
  43.  
  44.        If Not Directory.Exists(Me.sourceDir) Then
  45.            Try
  46.                Directory.CreateDirectory(Me.sourceDir)
  47.  
  48.            Catch ex As Exception
  49.                Throw
  50.  
  51.            End Try
  52.        End If
  53.  
  54.        With Me.pgProcess
  55.            .Start()
  56.            .BeginOutputReadLine()
  57.            .BeginErrorReadLine()
  58.            ' .WaitForExit(milliseconds:=0)
  59.            .WaitForExit()
  60.        End With
  61.  
  62.    End Sub
  63.  
  64.    Private Sub PGprocess_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) _
  65.    Handles pgProcess.OutputDataReceived
  66.  
  67.        If Not String.IsNullOrEmpty(e.Data) Then
  68.            Debug.WriteLine(String.Format("out: {0}", e.Data))
  69.        End If
  70.  
  71.    End Sub
  72.  
  73.    Private Sub PGprocess_ErrorDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) _
  74.    Handles pgProcess.ErrorDataReceived
  75.  
  76.        If Not String.IsNullOrEmpty(e.Data) Then
  77.            Debug.WriteLine(String.Format("err: {0}", e.Data))
  78.        End If
  79.  
  80.    End Sub
  81.  
  82.    Private Sub PGprocess_Exited(ByVal sender As Object, ByVal e As EventArgs) _
  83.    Handles pgProcess.Exited
  84.  
  85.        Debug.Print(String.Format("Process exited at {0}", Date.Now.ToShortTimeString))
  86.  
  87.    End Sub
  88.  
  89. End Class

Lee un poco sobre la class Process, y técnicas de IPC en .Net.

Saludos.


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: FOXAR en 2 Marzo 2015, 22:50 pm
guaw no tenia ni idea que eso se podía hacer de esta manera.

la verdad es que el código de vb.net que yo tengo genera la creación de ese archivo .bat recibiendo como parámetros la ruta el password el usuario el host y el nombre. y luego en otro botón ejecuto ese archivo .bat
espero que me disculpes soy nuevo en este foro y agradezco mucho su ayuda

muchas gracias  ;-)


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: Eleкtro en 2 Marzo 2015, 22:57 pm
Sigue este consejo: Olvida completamente Batch, y también el uso de aplicaciones externas commandline en la medida de lo posible, jeje.

Con el ejemplo que te he mostrado, primero deberás comprobar si el formato que le dí a las cadenas es la correcta para tí, y podrás leer la salida del proceso 'pgdump.exe', ya a apartir de ahí implementar una ProgressBar es cosa tuya, por que para llevarlo a cabo se requiere leer la salida estándar del proceso (en el event-handler 'PGprocess_OutputDataReceived') y realizar las estimaciones necesarias teniendo en cuenta que dicho programa muestre algún indicador de progreso, claro está, ya sea un porcentaje o la cantidad de archivos copiados y restantes.

Si el proceso no muestra ese tipo de información entonces solo puedes crear una barra de progreso con progreso indeterminado, y esperar a que el la instancia del proceso envie el evento de terminación del proceso (event-handler 'PGprocess_Exited')

Código
  1.        With Me.ProgressBar1
  2.            .Style = ProgressBarStyle.Marquee
  3.            .MarqueeAnimationSpeed = 50
  4.        End With

EDITO: Se me ocurre una cosa viable, si conoces la cantidad de archivos a copiar y su ubicación, entonces podrías calcular el porcentaje de la barra de progreso leyendo los bytes totales de los archivos de origen, y los bytes que se han copiado en el directorio destino.
Puedes utilizar la class FileInfo para leer el tamaño de bytes de un archivo.

Saludos


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: FOXAR en 2 Marzo 2015, 23:08 pm
muchas gracias por tu ayuda  :xD
el código que me pasaste no lo entiendo muy bn pero ya estoy tratando de comprenderlo  :xD me has ayudado mucho gracias por hacer que entienda la programación de una mejor manera  ;-)


Título: Re: Archivo .bat sincronizado con barra de estado en visual bacic.net
Publicado por: FOXAR en 2 Marzo 2015, 23:15 pm
es una sola base de datos que se aloja en el servidor una ves se ejecuta el .bat genera un baku de posgresql con todas sus tablas información en las tablas funciones disparadores tigger etc. eso demora dependiendo que tan cargada este la base de datos