Archivo .bat sincronizado con barra de estado en visual bacic.net

Iniciado por FOXAR, 2 Marzo 2015, 21:08 PM

0 Miembros y 2 Visitantes están viendo este tema.

FOXAR

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 

engel lex

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...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

FOXAR

solo crea la carpeta donde se va a guardar y luego guarda en esa ruta mas no retorna un valor

Eleкtro

#3
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








FOXAR

haaa este es .bat
Código (dos) [Seleccionar]

@echo off
cls

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%"

cd "D:\ruta\backup\%date:~6,4%\%date:~3,2%\%date:~0,2%%date:~3,2%%date:~6,4%"


SET PGPASSWORD=contraseña
"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.

Eleкtro

#5
¿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 (vbnet) [Seleccionar]
Imports System.Globalization
Imports System.IO
Imports System.Text

Public Class TestForm

   ReadOnly backupDirDateFormat As String =
       Date.Today.ToString("yyyy\\MM\\ddMMyyyy", CultureInfo.InvariantCulture)

   ReadOnly dbFilenameDateFormat As String =
       Date.Now.ToString("ddMMyyyy_HH\H\Hmm\M\M", CultureInfo.InvariantCulture)

   ReadOnly sourceDir As String = "D:\ruta\backup"
   ReadOnly backupDir As String = Path.Combine(Me.sourceDir, Me.backupDirDateFormat)
   ReadOnly dbSrcFilepath As String = Path.Combine(Me.backupDir, String.Format("basede datos-{0}.backup", Me.dbFilenameDateFormat))
   ReadOnly dbDstFilepath As String = Path.Combine(Application.StartupPath, "Nombre del backup")

   ReadOnly pgFilepath As String = "C:\Archivos de programa\PostgreSQL\9.3\bin\pg_dump.exe"
   ReadOnly pgPassword As String = String.Empty
   ReadOnly pgArgsFormat As String =
       <a>--host "localhost" --port "5432" --username "siscolsi" --format "custom" --blobs --verbose --file "{0}" "{1}"</a>.Value

   Private WithEvents pgProcess As New Process With
       {
           .EnableRaisingEvents = True,
           .StartInfo = New ProcessStartInfo With
                        {
                            .FileName = Me.pgFilepath,
                            .Arguments = String.Format(Me.pgArgsFormat, Me.dbSrcFilepath, Me.dbDstFilepath),
                            .CreateNoWindow = False,
                            .RedirectStandardError = True,
                            .RedirectStandardOutput = True,
                            .StandardErrorEncoding = Encoding.Default,
                            .StandardOutputEncoding = Encoding.Default,
                            .UseShellExecute = False,
                            .WindowStyle = ProcessWindowStyle.Hidden,
                            .WorkingDirectory = Application.StartupPath
                        }
       }

   Private Sub TestForm_Load() _
   Handles MyBase.Load

       If Not Directory.Exists(Me.sourceDir) Then
           Try
               Directory.CreateDirectory(Me.sourceDir)

           Catch ex As Exception
               Throw

           End Try
       End If

       With Me.pgProcess
           .Start()
           .BeginOutputReadLine()
           .BeginErrorReadLine()
           ' .WaitForExit(milliseconds:=0)
           .WaitForExit()
       End With

   End Sub

   Private Sub PGprocess_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) _
   Handles pgProcess.OutputDataReceived

       If Not String.IsNullOrEmpty(e.Data) Then
           Debug.WriteLine(String.Format("out: {0}", e.Data))
       End If

   End Sub

   Private Sub PGprocess_ErrorDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) _
   Handles pgProcess.ErrorDataReceived

       If Not String.IsNullOrEmpty(e.Data) Then
           Debug.WriteLine(String.Format("err: {0}", e.Data))
       End If

   End Sub

   Private Sub PGprocess_Exited(ByVal sender As Object, ByVal e As EventArgs) _
   Handles pgProcess.Exited

       Debug.Print(String.Format("Process exited at {0}", Date.Now.ToShortTimeString))

   End Sub

End Class


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

Saludos.








FOXAR

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

Eleкtro

#7
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 (vbnet) [Seleccionar]
       With Me.ProgressBar1
           .Style = ProgressBarStyle.Marquee
           .MarqueeAnimationSpeed = 50
       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








FOXAR

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

FOXAR

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