Executer une commande

othmani
Executer une commande

Bonjour,
est il possible d'executer une commande avec java?
si oui comment je peux executer la comande:

Quote:

regedit /E c:\MaBase.txt"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run"

Merci d'avance
Niroken
Une aide:)

Voici un morceau de code qui peut te permmettre d'effectuer
une commande.

Le soucis c'est que visiblement la JVM n'est pas capable d'aller
chercher les variables d'envrionnement system ce qui fait que
lorsque tu fais
runtime.exec("dir"); il pète une erreur.
Donc pour contourner tu lui donne le path complet
runtime.exec("C:\\WINDOWS\\.System32\dir.exe") s'il se trouve là:)

import java.io.*;

public class Cmd
{
	public static void main(String[] args)
	{
		try
		{
			Runtime runtime = Runtime.getRuntime();
			Process proc = runtime.exec("C:\\WINDOWS\\explorer.exe");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

Bonne chance

fredericmazue

Quote:
Le soucis c'est que visiblement la JVM n'est pas capable d'aller
chercher les variables d'envrionnement system ce qui fait que
lorsque tu fais

C'est une plaisanterie ?
Quand tu lances une commandes avec Runtime.exec, si la commande est dans le PATH elle est lancée *par le système* car c'est ce que demande de faire Runtime.exec. La JVM n'a même pas besoin d'être au courant du PATH.
Ceci dit la JVM lit parfaitement le PATH. Par exemple lorsqu'elle doit charger une librairie native, elle ne peut le faire que lorsque la dite librairie est dans le PATH justement.
Quote:
runtime.exec("dir"); il pète une erreur.

Il va même en pêter deux.
D'abord la première, parce que sous Windows dir ne peut pas être lancé, PATH ou pas. Le code correct est:
runtime.exec("cmd.exe /c dir");

Ensuite la deuxième erreur. Ce lancement à l'emporte pièce est incorrect. Dès que le commande lancée émet un ou deux octets il y a un BufferOverflow des E/S. Pour que ça puisse marcher correctement en toute situation, il est impératif de procéder les E/S dans un thread. Au minimum, l'entrée, qui capte la sortie de la commande lancée Voici un code correct, extrait d'un article paru dans Programmez! 82

package programmez.fred.processesdemo;

import java.util.*;
import java.io.*;

class StdHandler extends Thread {
    InputStream is;
    String type;
    
    StdHandler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }
    
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String ligne=null;
            while ( (ligne = br.readLine()) != null)
                System.out.println(type + "> " + ligne);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

public class Demo4 {
    public static void main(String[] args) throws Throwable {
        if (args.length <= 0) {
            System.err.println("Donnez une commande a lancer");
            System.exit(-1);
        }
        System.out.printf("\nSortie de la commande %s: \n",
                Arrays.toString(args));
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(args);
        
        StdHandler stderr = new
                StdHandler(process.getErrorStream(), "stderr");
        
        StdHandler stdout = new
                StdHandler(process.getInputStream(), "stdout");
        
        stderr.start();
        stdout.start();
        int status = process.waitFor();
        System.out.println("Valeur de retour du sous proc: " + status);
    }
}

Tu peux essayer de code en lui donnant cmd.exe /c dir comme argument.

PS: Le code marche aussi sous Linux, mais dans ce cas tu lui donnes pas cmd.exe /c dir hein ? :lol:

othmani

Merci Niroken ton code ca tres bien marché
merci :D

fredericmazue

Quote:

MessagePosté le: Ven Juin 08, 2007 1:19 pm Sujet du message:
Merci Niroken ton code ca tres bien marché

Tant mieux si tu es contente, mais je suis navré, le code de Niroken est mal formé et ce qu'il a dit est complètement faux qui plus est, ce que tu peux vérifier si le coeur t'en dit, sur le site de Sun dans un tutorial relatif à Runtime.exec
Il est vrai qu'un code mal formé à base de Runtime.exec marche parfois. Mais tout le problème est dans le parfois. Parce que parfois pas.
Enfin bref... :evil:
othmani

bon frederic je sais pas koi dire mais je te remercie toi aussi pour tout l'effort que tu as fais pour bien repondre à mes questions qui etaient tout le temp enbetantes mais tu sais je suis à une etape d'accepter n'importe quel code tant qu'il marche et donne une reponse satisfaisante puisque le temps me presse et il ne me reste plus.
bref merci :wink:

fredericmazue

Quote:
je sais pas koi dire [...]mais tu sais je suis à une etape d'accepter n'importe quel code tant qu'il marche et donne une reponse satisfaisante puisque le temps me presse

"tant" qu'il marche... Mais peut être que le jour J il ne marchera pas ce code que tu as accepté.
Pourquoi tu n'as pas pris le mien qui est garanti marcher ? Moi je ne peux pas comprendre ce choix. Et pour reprendre ton expression, moi non plus je ne sais pas quoi dire.
Ca fait plusieurs fois que j'ai essayé de t'aider sur ce forum sur beaucoup de sujets. J'essaie mais je n'y arrive pas, car tu n'écoutes jamais ce que je peux te dire. Je dois avoir un mauvais fluide ou quelque chose comme ça :evil:
othmani

Quote:

car tu n'écoutes jamais ce que je peux te dire

Ce n’est pas vrai car j'ai pris toutes tes remarques en considération, je l'ai tester et je l'ai utilisé aussi la plupart du temps.
Ce dernier code je l'ai enregistré afin de l'utiliser une autre fois en tout cas je suis désolée si je t'ai déçu.
J’ai d’autres questions n’hésite pas de me conseiller :wink: .
fredericmazue

Quote:
Ce dernier code je l'ai enregistré afin de l'utiliser une autre fois

CQFD :lol:
Aphrael

Bonjour,

Je voudrais lancer depuis mon programme java la commande pour utiliser WSDL2java afin de créer mon stub.

j'ai bien récuperé ton code fredericmazue mais lorsque je le met dans eclipse il me sort une erreur sur la ligne :

 System.out.printf("\nSortie de la commande %s: \n", 
                Arrays.toString(args));

Quote:
The method toString() in the type Object is not applicable for the arguments (String[])

j'ai pourtant bien les même libs. Je suis sous eclipse en jdk 1.4
une idée?

fredericmazue

printf n'existe qu'à partir de jdk 1.5....

Aphrael

Ok merci c'est bien ce que je pensais :?

bon c'est pas grave du coup j'ai arrangé tout ca à ma sauce. En tout cas merci pour la réponse rapide.