PDA

View Full Version : Visualizzare Contenuto Finestra Dos in TextBox


brubaker
28-10-2014, 22:08
Ragazzi tramite questo comando :

Dim zipFile As String
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles SAVE.Click

Dim id As Integer = Shell(String.Format("InstallFiles\7z.exe a -t7z -m9=LZMA2 -aoa {0} {1}", zipFile, sourceDir))
Console.WriteLine(id)

Che fa partire una compressione in 7zip, vorrei far apparire in una Texbox o RichTextBox il contenuto del comando, come generato in dos...come devo fare?
Spero che qualcuno mi sappia dare una risposta.....:) :rolleyes:

Daniels118
29-10-2014, 10:53
Vuoi visualizzare solo il comando o anche l'output?
Nel primo caso la risposta è semplicissima, basta assegnare l'output di String.Format ad una variabile d'appoggio, quindi assegni tale variabile alla proprietà text della textbox e poi la passi alla funzione Shell.
Nel secondo caso la cosa si complica un po', fammi sapere cosa ti serve.

brubaker
29-10-2014, 12:40
Vuoi visualizzare solo il comando o anche l'output?
Nel primo caso la risposta è semplicissima, basta assegnare l'output di String.Format ad una variabile d'appoggio, quindi assegni tale variabile alla proprietà text della textbox e poi la passi alla funzione Shell.
Nel secondo caso la cosa si complica un po', fammi sapere cosa ti serve.

No..mi interessa visualizzare i vari passaggi mentre comprime, cosi come si visualizza nella finestra DOS. in modo che la finestra dos la riduco a icona "..., 0, False, )" e nel Texbox o RichTextBox visualizzo la stessa cosa.:) :confused:

Daniels118
29-10-2014, 14:35
Bene, hai due possibilità:
1) redirigere l'output su un file e leggerlo, ma vedresti l'output solo ad esecuzione conclusa;
2) catturare direttamente lo standard output.

Nel tuo caso penso che ti interessi la seconda modalità, puoi prendere spunto da qui:
http://stackoverflow.com/questions/8809194/get-the-output-of-a-shell-command-in-vb-net
però invece di utilizzare ReadToEnd che bloccherebbe l'esecuzione fino al termine del comando, crea un timer ed utilizza i metodi Peek e Read.
Alla fine ricordati di rilasciare le risorse.

brubaker
29-10-2014, 15:34
Bene, hai due possibilità:
1) redirigere l'output su un file e leggerlo, ma vedresti l'output solo ad esecuzione conclusa;
2) catturare direttamente lo standard output.

Nel tuo caso penso che ti interessi la seconda modalità, puoi prendere spunto da qui:
http://stackoverflow.com/questions/8809194/get-the-output-of-a-shell-command-in-vb-net
però invece di utilizzare ReadToEnd che bloccherebbe l'esecuzione fino al termine del comando, crea un timer ed utilizza i metodi Peek e Read.
Alla fine ricordati di rilasciare le risorse.

Provato ma non funziona un Kaiser..."crea un timer ed utilizza i metodi Peek e Read" non ho studiato ste cose, :mbe: se non chiedo troppo mica potresti metterci una mano tu..dato che sei preparato, e farmi un esempio veloce... mi faresti un grande favore.:help:

Daniels118
29-10-2014, 15:41
Hai provato l'esempio che ti ho indicato senza fare modifiche? Cos'è che non funziona? Posta il codice che hai scritto.

brubaker
29-10-2014, 16:15
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

If BinFile1 <> Nothing And sourceDir1 <> Nothing Then
Dim id1 As Integer = Shell(String.Format("InstallFiles\7z.exe a -t7z -m9=LZMA2 -aoa {0} {1}", BinFile1, sourceDir1), 2, True)
Console.WriteLine(id1)
Else
Dim myProcess As New Process()
' Start a new instance of this program but specify the 'spawned' version.
Dim myProcessStartInfo As New ProcessStartInfo("%__CD__%\InstallFiles\7z.exe")
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
Dim myStreamReader As StreamReader = myProcess.StandardOutput
' Read the standard output of the spawned process.
Dim myString As String = myStreamReader.ReadLine()
Console.WriteLine(myStreamReader)
myProcess.WaitForExit()
myProcess.Close()
End If
End Sub

Daniels118
29-10-2014, 16:27
Non mi sembra che tu abbia adattato correttamente il codice...
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim comando As String
comando = "InstallFiles\7z.exe"
Dim parametri As String
parametri = String.Format("a -t7z -m9=LZMA2 -aoa {0} {1}", BinFile1, sourceDir1)
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo(comando, parametri)
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
Dim myStreamReader As StreamReader = myProcess.StandardOutput
Dim sOutput As String
Using oStreamReader As System.IO.StreamReader = myProcess.StandardOutput
sOutput = oStreamReader.ReadToEnd()
End Using
Console.WriteLine(sOutput)
End Sub
Questo dovrebbe stampare a console l'output del comando al termine dello stesso, comincia a provarlo e poi vediamo cosa aggiustare.

brubaker
29-10-2014, 16:41
Ok diciamo che si smuove qualcosa...la compressione funziona..ma mi esce la finestra dos vuota, con solo il cursore...e sull'intestazione della finestra la percentuale di avanzamento...nella finestra RichTextBox1..nulla
Scusa ..ma il comando Textbox o RichTextBox, lo dobbiamo inserire??????

RichTextBox = ? sOutput

Daniels118
29-10-2014, 16:46
Intendevo dire che dovresti vedere l'output nella console dell'IDE.
Sostituisci quest'istruzione
Console.WriteLine(sOutput)
con questa
textbox.text = sOutput
ovviamente al posto di textbox dovrai metterci il nome della tua textbox.

brubaker
29-10-2014, 17:02
Ok funziona..ma solo a compressione finita..mi esce l'output della console..durante la compressione non esce nulla...:doh: volevo far scorrere il realtime cosi' come scorre nella finestra Dos..

http://i61.tinypic.com/2egfjib.png

http://i62.tinypic.com/v3j6sz.png

Meglio visualizzare lo scorrere del comando su entrambi "se possibile" ...mentre comprime, che vedere solo il risultato alla fine....!!!!!!

Daniels118
29-10-2014, 21:53
Si si, l'avevo capito, è per questo che bisogna mettere il timer, ma ora è tardi, ne riparliamo domani, se qualcuno vuole precedermi si faccia avanti :D

brubaker
29-10-2014, 22:35
Si si, l'avevo capito, è per questo che bisogna mettere il timer, ma ora è tardi, ne riparliamo domani, se qualcuno vuole precedermi si faccia avanti :D

OK Ti ringrazio a domani...anche perche' sembra che nessun altro riesca a dare una soluzione...:rolleyes: :confused:

Daniels118
30-10-2014, 10:46
Ancora meglio di un timer:
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim comando As String
comando = "InstallFiles\7z.exe"
Dim parametri As String
parametri = String.Format("a -t7z -m9=LZMA2 -aoa {0} {1}", BinFile1, sourceDir1)
Dim myProcess As New Process()
AddHandler myProcess.OutputDataReceived, AddressOf myOutputHandler
Dim myProcessStartInfo As New ProcessStartInfo(comando, parametri)
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
myProcess.BeginOutputReadLine()
End Sub

Private Shared Sub myOutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
textbox.text = textbox.text + outLine.Data
End If
End Sub

brubaker
30-10-2014, 14:32
Non Mi trovo:mad:
Private Shared Sub myOutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
RichTextBox1 = RichTextBox1 + outLine.Data
End If
End Sub
Mi da errore ai sottolineati.:Errore1 Impossibile fare riferimento a un membro di istanza di una classe all'interno di un metodo condiviso o di un inizializzatore di membri condivisi senza un'istanza esplicita della classe.

P.S Da premettere che alla fine sono piu' processi :
Dim comando1 As String
comando1 = "InstallFiles\7z.exe"
Dim parametro1 As String
parametro1 = String.Format("a -t7z -m9=LZMA2 -aoa {0} {1}", BinFile1, sourceDir1)
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo(comando1, parametro1)

Dim comando2 As String
comando2 = "InstallFiles\7z.exe"
Dim parametro2 As String
parametro2 = String.Format("a -t7z -m9=LZMA2 -aoa {0} {1}", BinFile2, sourceDir2)
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo(comando2, parametro2)
:)

Daniels118
30-10-2014, 16:41
Giusto, devi creare una variabile shared ed assegnarle l'istanza di RichTextBox1 per potervi accedere da un metodo shared.
Puoi valorizzare la variabile nell'evento load del form.

brubaker
30-10-2014, 17:05
Giusto, devi creare una variabile shared ed assegnarle l'istanza di RichTextBox1 per potervi accedere da un metodo shared.
Puoi valorizzare la variabile nell'evento load del form.
:boh:
Private Shared Sub myOutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
Dim RichTextBox1 As String
If Not String.IsNullOrEmpty(outLine.Data) Then
RichTextBox1 = RichTextBox1 + outLine.Data
End If
End Sub
Avviso1 La variabile 'RichTextBox1' viene utilizzata prima che le sia stato assegnato un valore. È possibile che venga restituita un'eccezione dovuta a un riferimento con valore null in fase di esecuzione.

Daniels118
31-10-2014, 09:37
Prova così:
Private Shared Sub myOutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
Form1.RichTextBox1.AppendText(outLine.Data)
End If
End Sub
Dove Form1 è il nome del form che contiene RichTextBox1.

brubaker
31-10-2014, 09:54
Prova così:
Private Shared Sub myOutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
Form1.RichTextBox1.AppendText(outLine.Data)
End If
End Sub
Dove Form1 è il nome del form che contiene RichTextBox1.

Nulla :muro: :muro: entrambe le finestre..DOS Rimane nera.... Rich Nada...:muro:

Daniels118
31-10-2014, 10:28
Che la finestra "DOS" rimanga nera è normale, l'output deve essere rediretto al programma, non può uscire da entrambe le parti, metti un breakpoint in myOutputHandler e lancia il debug, controlla che venga richiamata e che
outLine.Data contenga l'output.

brubaker
31-10-2014, 10:59
"metti un breakpoint in myOutputHandler e lancia il debug, controlla che venga richiamata e che outLine.Data contenga l'output"
Bhe se i parametri sono stati inseriti, (si presume giusti) per quale motivo "outLine.Data" non dovrebbe contenere l'output di uscita nel RichBox.???

:boh: Ma io cio' perso tutte le speranze in questa cosa....:doh:

CMQ messo punto di interruzione in "myOutputHandler"..."outLine.Data" ...nessuno errore che devo controllare.?
Sending process ROSSO...{System.Diagnostics.Process (7z)}

brubaker
31-10-2014, 14:24
Nessuna idea????..parte Daniele, ce uno spirito di partecipazione in questo forum...Esagerato!!!!:eek: :eek: