27/12/16 21:02
GN
Ma hai provato ad avviarlo tramite cmd.exe come ti dicevo prima? Comunque, questo
mi fa notare solo ora questa parte del codice che hai postato prima:
Forse sono io che non capisco bene, oppure l'hai già corretta, ma mi sembra che ci sia qualcosa che non quadra.
Come puoi vedere qui msdn.microsoft.com/it-it/library/…(v=vs.110).aspx, il metodo AppendAllLines prende due argomenti. Il primo è il percorso del file su cui scrivere ed il secondo è una collezione di stringhe da scrivere sul file una per riga.
Perchè stai passando come primo argomento un nome di file concatenato al contenuto di un elemento di ListaComandi? Così facendo, se ad esempio l'elemento di indice 1 in ListaComandi è la stringa ciao, il file su cui andrai a scrivere sarà C:\install.batciao. Sicuro che è quello che volevi ottenere? Mi sembra alquanto strano, comunque se lo fosse dovresti tenerne conto quando vuoi avviare il file, cioè dovresti fare Process.Start("cmd.exe", "/C C:\install.bat" + ListaComandi.Items(1).ToString), e comunque non so se funzionerebbe dato che il file avrebbe un'estensione sconosciuta (tornando all'esempio, l'estensione batciao).
Inoltre, perchè stai usando quel metodo se scrivi una sola stringa alla volta (che inserisci in un'array di un singolo elemento usando le graffe per renderla una collezione)? Per scrivere una sola stringa c'è il metodo AppendAllText (vedi msdn.microsoft.com/it-it/library/…(v=vs.110).aspx).
Comunque, farlo in un ciclo non è ottimale perchè continui ad aprire il file e chiuderlo tante volte quante sono le linee da scrivere. Il metodo corretto e più efficiente (a mia conoscenza) è aprire il file prima del ciclo, scrivere sullo stream aperto nel ciclo, e poi chiudere il file (è questa l'operazione che rende definitiva la scrittura su disco) appena dopo il ciclo. Non mi ricordo quali sono classi/metodi del .net per farlo ma li trovi con una veloce ricerca.
Inoltre ho notato che come estremo superiore del ciclo usi ListaComandi.Items.Count + 2 , e all'interno del ciclo accedi agli Item usando l'indice del ciclo stesso (ListaComandi.Items.Item(Indice)). Se non sbaglio l'ultimo elemento della lista ha indice Items.Count-1, come è possibile che accedi agli altri dopo? Quel codice dovrebbe causare una IndexOutOfRangeException. E se per caso hai messo tutto il codice in un Try...Catch che prende tutte le eccezioni, probabilmente è uno dei motivi per cui non ti esegue il bat: il flusso di esecuzione esce dal try ed entra nel catch non appena il ciclo arriva al primo indice a cui non si può più accedere, e la chiamata al Process.Start, se è anch'essa nel blocco try, non verrà mai eseguita.
se elimino la parte del codice che genera il .bat , e lo creo manualmente l'applicazione riesce ad avviarlo
mi fa notare solo ora questa parte del codice che hai postato prima:
For Indice As Short = 2 To ListaComandi.Items.Count + 2 IO.File.AppendAllLines("C:\install.bat" & ListaComandi.Items(1).ToString, {ListaComandi.Items.Item(Indice)}) Next
Forse sono io che non capisco bene, oppure l'hai già corretta, ma mi sembra che ci sia qualcosa che non quadra.
Come puoi vedere qui msdn.microsoft.com/it-it/library/…(v=vs.110).aspx, il metodo AppendAllLines prende due argomenti. Il primo è il percorso del file su cui scrivere ed il secondo è una collezione di stringhe da scrivere sul file una per riga.
Perchè stai passando come primo argomento un nome di file concatenato al contenuto di un elemento di ListaComandi? Così facendo, se ad esempio l'elemento di indice 1 in ListaComandi è la stringa ciao, il file su cui andrai a scrivere sarà C:\install.batciao. Sicuro che è quello che volevi ottenere? Mi sembra alquanto strano, comunque se lo fosse dovresti tenerne conto quando vuoi avviare il file, cioè dovresti fare Process.Start("cmd.exe", "/C C:\install.bat" + ListaComandi.Items(1).ToString), e comunque non so se funzionerebbe dato che il file avrebbe un'estensione sconosciuta (tornando all'esempio, l'estensione batciao).
Inoltre, perchè stai usando quel metodo se scrivi una sola stringa alla volta (che inserisci in un'array di un singolo elemento usando le graffe per renderla una collezione)? Per scrivere una sola stringa c'è il metodo AppendAllText (vedi msdn.microsoft.com/it-it/library/…(v=vs.110).aspx).
Comunque, farlo in un ciclo non è ottimale perchè continui ad aprire il file e chiuderlo tante volte quante sono le linee da scrivere. Il metodo corretto e più efficiente (a mia conoscenza) è aprire il file prima del ciclo, scrivere sullo stream aperto nel ciclo, e poi chiudere il file (è questa l'operazione che rende definitiva la scrittura su disco) appena dopo il ciclo. Non mi ricordo quali sono classi/metodi del .net per farlo ma li trovi con una veloce ricerca.
Inoltre ho notato che come estremo superiore del ciclo usi ListaComandi.Items.Count + 2 , e all'interno del ciclo accedi agli Item usando l'indice del ciclo stesso (ListaComandi.Items.Item(Indice)). Se non sbaglio l'ultimo elemento della lista ha indice Items.Count-1, come è possibile che accedi agli altri dopo? Quel codice dovrebbe causare una IndexOutOfRangeException. E se per caso hai messo tutto il codice in un Try...Catch che prende tutte le eccezioni, probabilmente è uno dei motivi per cui non ti esegue il bat: il flusso di esecuzione esce dal try ed entra nel catch non appena il ciclo arriva al primo indice a cui non si può più accedere, e la chiamata al Process.Start, se è anch'essa nel blocco try, non verrà mai eseguita.
Ultima modifica effettuata da GN 27/12/16 21:05
aaa