Autore Topic: Esecuzione comando shell all'interno di un LOOP  (Letto 2235 volte)

  • Visitatore
Esecuzione comando shell all'interno di un LOOP
« il: 31 Maggio 2008, 11:47:49 »
Ciao.

Nel loop sotto postato faccio un SHELL rm ecc ecc per ogni percorso memorizzato nella stringa[].

Il problema è che :

Così com'è funziona benissimo se nella stringa[] ci sono MENO di 5 percorsi (forse sto facendo uno shareware senza saperlo :lol:) , da 4 in su crasha tutto ( troppe cose in background ?? ).

Se metto WAIT prima di FOR INPUT OUTPUT oppure prima del next oppure in qualsiasi altro posto ,il loop si mi esegue solo il comando relativo al primo percorso della stringa[]  :-?

Ho visto che togliendo l FOR INPUT OUTPUT non ho più la limitazione di 5, però a questo punto come mi posso intercettare gli eventuali messaggi d'errore ? Oltretutto uso il process_kill per aggiornare la pagina ..... quindi ne ho una vitale necessità ... :muro:

Visto che siamo in ballo ... qualcuno riesce a spiegarmi la differenza sostanziale fra EXEC e SHELL ???



FOR EACH item IN Variabili.cDir
       IF Variabili.azione = "rm -f" THEN
         IF NOT canc THEN
         SELECT Message.Warning("Cancello ?", "OK", "Annulla")
          CASE 1
          canc = TRUE
         END SELECT
       ENDIF
     IF canc THEN SHELL "rm -rfv " & Chr(34) & item & Chr(34) FOR INPUT OUTPUT AS "errori"

next



Bye Bye

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #1 il: 31 Maggio 2008, 17:47:22 »
forse la soluzione sta nel controllare il processo di ogni rm
ovvero prima di iniziare un nuovo ciclo ( ovvero prima di arrivare al next controlli se il processo lanciato e terminato oppure no , se è terminato vai avanti con i cicli

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #2 il: 31 Maggio 2008, 17:55:17 »
Codice: [Seleziona]


FOR EACH item IN Variabili.cDir
         IF Variabili.azione = "rm -f" THEN

         IF NOT canc THEN
             SELECT Message.Warning("Cancello ?", "OK", "Annulla")
                      CASE 1
                      canc = TRUE
             END SELECT
         ENDIF
       
   IF canc THEN
   

   hproces= SHELL "rm -rfv " & Chr(34) & item & Chr(34) FOR INPUT OUTPUT AS errori"
   

   ripeti:

   if hproces.state=1 then
      goto ripeti
      wait
   endif




NEXT

 




guarda un' pò se qualcosa del genere può funzionare

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #3 il: 31 Maggio 2008, 18:29:05 »
Oppure puoi direzionare l'output da sistema su un file, e poi leggerlo da gambas:

Codice: [Seleziona]

IF canc THEN SHELL "rm -rfv " & Chr(34) & item & Chr(34) & " >> Errori.log 2>&1"


Il file "Errori.log" lo leggi con un "var=File.Read()", e analizzi la stringa all'interno di Gambas.
I caratteri ">>" accodano tutti i messaggi e gli errori al file, se scegli di analizzarne uno alla volta, sostituisci ">>" con ">".

  • Visitatore
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #4 il: 31 Maggio 2008, 18:44:32 »
... con la soluzione di fsurfing il process.state mi resta sempre a 1 (ho fatto PRINT process.stata,  non capisco perchè ? ) e quindi mi si pianta tutto .....

con la soluzione di md9327 mi toccherebbe sconvolgere metà programma =P

EDIT

Non è quella la parte che mi crea problemi  :shit:

E' la parte errori_kill ..... l'ho commentata ....  mò verifico ... scusate

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #5 il: 31 Maggio 2008, 18:56:17 »
Codice: [Seleziona]


FOR EACH item IN Variabili.cDir
         IF Variabili.azione = "rm -f" THEN

         IF NOT canc THEN
             SELECT Message.Warning("Cancello ?", "OK", "Annulla")
                      CASE 1
                      canc = TRUE
             END SELECT
         ENDIF
       
   IF canc THEN
   

    errori= SHELL "rm -rfv " & Chr(34) & item & Chr(34)  FOR READ WRITE AS "errori"
   
   endif

   ripeti:

   if errori.state=1 then
      goto ripeti
      wait
   endif




NEXT
 



prova cosi allora e vediamo come va! :-P

  • Visitatore
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #6 il: 31 Maggio 2008, 19:07:48 »
già ....
facevo troppe operazioni in errori_kill, quando avevo troppi processi che finivano in fretta .....

ho messo inc x dentro il errori_kill che azzero ogni 3 secondi .....

non mi era minimamente passato per la testa se non quando cercavo di capire come killare il processo dell esempio di fsurfing :shit:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #7 il: 31 Maggio 2008, 19:11:45 »
ma  a cosa ti serve il errori_kill ?

  • Visitatore
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #8 il: 31 Maggio 2008, 19:32:51 »
ho una iconview che mi fà da filemanager

con process_read mi ricavo eventuali errori tipo "cannot stat " oppure se faccio -v (verbose)

con process_kill mi faccio il refresh dell'iconview una volta terminata la copia o l'eliminazione o qualsiasi cosa ho fatto ....

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #9 il: 31 Maggio 2008, 20:55:01 »
ok capito :-)

hai cmq risolto i broblemi?

ma quand'è che ci fai visionare una preview del tuo programma? :punzecchio:

  • Visitatore
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #10 il: 31 Maggio 2008, 22:54:46 »
Beh te lo posso allegare..... è ancora un'accozzaglia e fatto su misura per il mio utilizzo .... però funziona abbastanza bene .... quando ti annoi dagli un'occhiata e consigliami ...

Vedrai tanta farina del tuo sacco :lol:

Se hai un account di msn lasciamelo che per domande e/o consigli ci sentiamo direttamente

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #11 il: 31 Maggio 2008, 23:32:00 »
hei è bellissimo! :cappello:
complimenti!!
lo sto provando e mi piace proprio..


però mi capita un errore quando voglio aprire  una cartella dalla finestra di destra.


io ho cerretto questa riga

Codice: [Seleziona]
 
Variabili.dimensione = Variabili.dimensione + Format((Stat(file).Size / 1024) / 1024, "####.##")


così

Codice: [Seleziona]
 
Variabili.dimensione = Variabili.dimensione + val(Format((Stat(file).Size / 1024) / 1024, "####.##"))



non ho msn mi spiace (msn?????????  :evil: ) :-)

  • Visitatore
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #12 il: 01 Giugno 2008, 11:44:32 »
Diciamo che senza il tuo aiuto non sarei nemmeno partito ... ricordi da sovrapposizione delle immagini ? mi serviva per fare i link ...

La gestione dei dischi, fatta grazie a te ( pannello con tasto nero per aprirlo,icona hard disk )

L'anteprima immagini grande/media/piccola direttamente sulla barra , fatta grazie a te

Hai visto anche l'embedder no ?


Diciamo che ogni filemanager che trovavo in giro o aveva la gestione delle icone che non mi garbavano, o era un affanno configurarlo, o non aveva la doppia finestra per copiare incollare i file....
Poi io adoro aggiungermi le cose man mano che mi servono o che mi vengono in mente ....


Un'icona con il nome dell'estensione ( esempio zip.png ) e hai cambiato l'icona relativa ( pannello con tasto nero per aprirlo,icona lampadina )

Un file di testo con la gestione dei programmi/estensioni ( pannello con tasto nero per aprirlo,icona foglio con matita )



ecc ecc ecc ecc

... l'account di messanger intendevo ... ...beh basta farsi una mail hotmail.... oppure dovrei avere ancora un account di icq ... sempre se poi hai il programmino

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #13 il: 01 Giugno 2008, 19:46:27 »
si si ho visto, mi fa piacere esserti stato di aiuto :-)

se posso permettermi ti indico alcuni bug

cerca di generalizzare il piu possibile il programma se poi intendi renderlo pubblico, ad esempio il pulsante per visualizzare le cartelle dei vari dischi punta su "/mnt" mentre su debian il percorso e "/media".

perchè il pulsante della home punta a "/root" e non alla mia home?

hai già provato a creare un eseguibile?

molto probabilmente non funzionerebbe a causa di passi come questo:
Codice: [Seleziona]
 caricando = file.Load(Application.Path &/ "Componenti/history/thumb")


infatti funziona tutto finche utilizzi l'ide di gambas ma creando l' eseguibile
i tuoi file non saranno in quel percorso ma all'interno dell' eseguibile stesso,
questo non vale per le immagini che le puoi caricare con  

immagine1=picture.load("/filesystem/device.png")

stesso discorso per eseguibili esterni tipo mrxvt

io ho risolto in questo modo nei miei programmini:

all' avvio controllo se il mio programma è gia stato lanciato altre volte

Codice: [Seleziona]


if not exist (user.home & "/.explorer") then
   
     mkdir (user.home & "/explorer")
     ...... comandi per copiare i vari componenti nelle varie cartelle
   
     esempio:
     

      COPY " /dati/componenti/programmi/mrxvt" TO user.home & /.explorer/dati/componenti/programmi
.....

endif

........il resto del tuo codice

 


inoltre per quanto riguarda programmi tipo mrxvt dovrai anche renderli eseguibili con il comando chmod  altrimenti non verranno lanciati da shell e exec


(il codice che ho scritto puo avere errori di sintassi inquanto scritto a memoria e non tramite gambas )


mi raccomando non offenderti per queste puntualizzazioni .... :-)
ti ripeto che hai fatto veramente un ottimo lavoro
i miei sono solo consigli che lasciano il tempo che trovano

ciao ciao

  • Visitatore
Re: Esecuzione comando shell all'interno di un LOOP
« Risposta #14 il: 02 Giugno 2008, 13:48:08 »
Figurati ... non son mica permaloso... anzi è sempre un bene sentire i pareri di altri.

Effettivamente io non avevo intenzione di renderlo pubblico, in quanto ci sono moltissimi filemanager in circolazione, e anche solamente avvicinarmi a qualcosa fatto da professionisti penso sia impossibile ( per impegno necessario e sopratutto per capacità ) ,  quello che sto facendo è una cosa molto artigianale , puntante al mio utilizzo specifico  .... te l'ho mostrato visto che lo hai chiesto e visto che sei stato parte (molto)attiva nella cosa ....

Nell'ottica di quello che ho appena detto ho i pulsanti che puntano verso le cartelle della mia disto e non mi sono nemmeno preoccupato di fare un qualcosa di "universale" ....

Ho già provato a fare l'eseguibile, e funziona ... forse perchè l'ho creato dentro la cartella stessa del progetto ??

Ciao