Prompt dei comandi

mercoledì 23 giugno 2010 - 10.29

getfar Profilo | Junior Member

Ciao a tutti,
sto impazzendo con il comando shell.
Se vado nel prompt dei comandi e digito

C:\prog.exe < myscript.txt

viene correttamente aperto il programma prg ed eseguito il batch contenuto nel file myscript.txt

Utilizzando in vb.net il comando
Shell("cmd.exe /c C:\prog.exe < myscript.txt")
non riesco ad ottenere lo stesso risultato.
Sapreste aiutarmi?
Grazie mille

freeteo Profilo | Guru

Ciao,
non conosco la funzione "Shell", cmq dovresti riuscire a fare tutto con la classe "Process", apposita per questo tipo di operazioni:
Process.Start("C:\prog.exe", "< myscript.txt")
o avevi già provato?

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

getfar Profilo | Junior Member

Purtroppo si.
Mi si apre il prompt ma senza che esegua la parte < myscript.txt.
In effetti se apro l'eseguibile ed inserisco < myscript.txt non mi funziona mentre se dal prompt arrivo al livello della cartella e scrivo
prog.exe < myscript.txt
funziona perfettamente

freeteo Profilo | Guru

Ciao,
ma "myscript.txt" a che path fa riferimento? prova a passare tutto il fullPath.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

aiedail92 Profilo | Expert

Ciao,

Non puoi fare in questo modo perché quello che passi non è un argomento del programma, ma un'operazione che esegue la shell, serve ad usare il file come input del programma.

Per ottenere lo stesso effetto devi creare un Process, specificare che vuoi la redirezione dell'input, avviare il processo, e quindi passargli l'input:

Dim proc As New Process() proc.StartInfo.FileName = "C:\prog.exe" proc.StartInfo.UseShellExecute = False proc.StartInfo.RedirectStandardInput = True proc.Start() Dim stdin As StreamWriter = proc.StandardInput Using sr As New StreamReader("myscript.txt") Do Until sr.EndOfStream Dim line As String = sr.ReadLine() stdin.WriteLine(line) Loop End Using stdin.Close()

Se ci sono problemi fammi sapere, perché ho scritto il codice al volo e non ho modo di testarlo.

Luca

getfar Profilo | Junior Member

Purtroppo lo streamreader non funge.

Ci siamo quasi però ...

aiedail92 Profilo | Expert

Non funge in che senso? Che errore dà?

Luca

getfar Profilo | Junior Member

L'eseguibile alla fine deve scrivere un file.
Il file non viene scritto.

aiedail92 Profilo | Expert

Non viene sollevata nessuna eccezione? Prova ad eseguire il programma in debug e segui il flusso del codice, verifica che le istruzioni dove dovrebbe scrivergli l'input vengano eseguite.

Luca

getfar Profilo | Junior Member

Alla fine ci sono riuscito ma mi resta solo un dubbio ...

E' possibile sapere quando processo ha copletato la sua funzione?

Cioè se lancio il processo esiste un evento "processo completo"?


Grazie mille

aiedail92 Profilo | Expert

Sì, c'è l'evento Exited: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx

Altrimenti puoi usare la proprietà HasExited

Luca

getfar Profilo | Junior Member

ho provato ad aggiungere

dopo lo stdin2.WriteLine(s2)
il codice

proc2.EnableRaisingEvents = True

' add an Exited event handler
AddHandler proc2.Exited, AddressOf Me.ProcessExited

e poi

Friend Sub ProcessExited(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myProcess As Process = DirectCast(sender, Process)
MessageBox.Show("The process exited, raising " & "the Exited event at: " & myProcess.ExitTime & _
"." & System.Environment.NewLine & "Exit Code: " & myProcess.ExitCode)
myProcess.Close()
End Sub


in questo modo non riesco a sapere quando il processo è finito ma quando si chiude la finestra del prompt.
Cioè dopo che ha finito il processo la finestra resta aperta e il messaggio di fine processo non finisce.
Giusto?

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5