Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di pos88
    Registrato dal
    Oct 2011
    Messaggi
    13

    [JAVA] Esecuzione comandi prompt

    Salve a tutti,
    ho già aperto una discussione simile tempo fa solo che ora ho un nuovo problema. Devo avviare un eseguibile da prompt e fin qui tutto bene.
    Il codice è il seguente:
    codice:
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("cmd.exe /C shp2pgsql.exe "+arg,null,path);
    arg è una stringa con i comandi, path è il percorso nel quale si trova l'eseguibile (shp2pgsql). Il problema è che una volta lanciato il programma mi viene richiesto di inserire un altro comando dopodichè parte l'esecuzione del programma.
    Spreste dirmi come posso fare a passare questo comando??
    Grazie mille in anticipo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Esecuzione comandi prompt

    Originariamente inviato da pos88
    codice:
    Process pr = rt.exec("cmd.exe /C shp2pgsql.exe "+arg,null,path);
    Innanzitutto se quel shp2pgsql.exe è appunto un "eseguibile", allora di per sé non ci sarebbe affatto bisogno di lanciare la shell (cmd). Questo solo per precisarlo, vale in generale.

    Originariamente inviato da pos88
    Il problema è che una volta lanciato il programma mi viene richiesto di inserire un altro comando dopodichè parte l'esecuzione del programma.
    Spreste dirmi come posso fare a passare questo comando??
    "chiesto di inserire" ... come? Sullo standard-input?

    Quando si lancia con Runtime, il framework redirezione tutti gli stream (std-in/out/err) del processo verso la applicazione Java. Quindi prendendo il OutputStream dal Process, potresti "scrivere" sullo standard-input del processo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di pos88
    Registrato dal
    Oct 2011
    Messaggi
    13
    shp2pgsql è un .exe ma richiede degli argomenti per essere lanciato, per questo deve essere eseguito dal prompt.
    Questo programma importa dei file su un databse. Una volta lanciato, di seguito compare una scritta che richiede una password che devo immettere. Mi potresti fare un esempio per testare quanto mi hai detto tu??Grazie mille.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da pos88
    shp2pgsql è un .exe ma richiede degli argomenti per essere lanciato, per questo deve essere eseguito dal prompt.
    Questo programma importa dei file su un databse. Una volta lanciato, di seguito compare una scritta che richiede una password che devo immettere. Mi potresti fare un esempio per testare quanto mi hai detto tu??Grazie mille.
    Dal Process prendi il OutputStream (scrive sullo standard-input) con getOutputStream(). Puoi scrivere dei byte direttamente o magari, meglio, incapsularlo in un PrintStream con l'auto-flush a true, così fai un println("tuaPassword") e invii la password. Per il codice esatto, vedi javadoc, non è niente di particolare o difficile.

    E funzionerebbe se (e ripeto se) quel programma legge la password da standard-input. Se usasse un input "diretto" dalla console a basso livello, non puoi farlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di pos88
    Registrato dal
    Oct 2011
    Messaggi
    13
    Ci ho provato ma molto probabilmente ancora non mi è chiaro. Ti allego il codice:
    codice:
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec("cmd.exe /C shp2pgsql.exe "+arg,null,path);
    BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
    PrintWriter output = new PrintWriter(pr.getOutputStream());
    String line=null;
    while((line=input.readLine()) != null) {
         System.out.println(line);
         //output.println(Connect.passw);
    }
    Non ho capito dove devo mettere output.println(Connect.passw). Inoltre quando lancio dal prompt viene fuori questo:
    codice:
    Shpefile type: Polygon
    Postgis type: MULIPOLYGON[2]
    Password for user postgres:
    che però non mi compare con il system.out del while sopra. Vuol dire qualcosa??

  6. #6
    Utente di HTML.it L'avatar di pos88
    Registrato dal
    Oct 2011
    Messaggi
    13
    Originariamente inviato da andbin
    E funzionerebbe se (e ripeto se) quel programma legge la password da standard-input. Se usasse un input "diretto" dalla console a basso livello, non puoi farlo.
    Credo di essere in questa situazione. Quale potrebbe essere una soluzione??

  7. #7
    Utente di HTML.it L'avatar di pos88
    Registrato dal
    Oct 2011
    Messaggi
    13
    Ho trovato una soluzione: eseguire prima del .exe un'istruzione:

    set PGPASSWORD=password

    Qualcuno mi sa dire come posso fare a mandare prima questa e poi l'eseguibile all'interno dello stesso processo?? Grazie mille

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da pos88
    Ho trovato una soluzione: eseguire prima del .exe un'istruzione:

    set PGPASSWORD=password

    Qualcuno mi sa dire come posso fare a mandare prima questa e poi l'eseguibile all'interno dello stesso processo?? Grazie mille
    Basta usare uno degli exec() di Runtime che ha tra i parametri il String[] envp per passare una o più variabili di ambiente al processo "figlio".
    Vedi documentazione javadoc.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di pos88
    Registrato dal
    Oct 2011
    Messaggi
    13
    Mi hai letteralmente salvato!è bastato mettere come valore dell'elemento 0 del vettore "PGPASSWORD=password". Grazie mille!!!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da pos88
    Mi hai letteralmente salvato!è bastato mettere come valore dell'elemento 0 del vettore "PGPASSWORD=password". Grazie mille!!!
    Nel tuo caso probabilmente ti va bene ma tieni presente che usando il exec con il String[] envp, solo le variabili di ambiente che definisci in questo array vengono passate al processo figlio. Il resto del environment che il processo "padre" possiede non viene ereditato dal processo figlio.

    Se ti serve che il processo figlio erediti tutto il environment più quella tua variabile specifica PGPASSWORD, allora devi: o generare un array con tutto l'environment più la tua variabile oppure usare ProcessBuilder (solo da Java 5) che è più flessibile nella gestione del environment perché ti permette di gestire una mappa "mutabile" delle variabili a cui basta che aggiungi la tua..

    Ma ripeto: magari nel tuo caso non ci sono conseguenze negative nel non passare il resto. Se però il processo che lanci inizia ad avere problemi perché gli mancano altre variabili di ambiente ... presta attenzione a questo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.