Avatar billede jespersahner Nybegynder
03. februar 2007 - 17:00 Der er 12 kommentarer og
1 løsning

Afvikling af .bat-fil vha. Runtime.getRuntime().exec()

Jeg forsøger uden held at køre en .bat-fil vha.:
Runtime.getRuntime().exec("cmd.exe C/ C:/Java/minfil.bat")

Også andre varianter har været prøvet:
Runtime.getRuntime().exec("cmd.exe C/ C:\\Java\\minfil.bat")
Runtime.getRuntime().exec("C:/Java/minfil.bat")
Runtime.getRuntime().exec("C:\\Java\\minfil.bat")
Runtime.getRuntime().exec(new String[] {"cmd.exe", "C/", "C:/Java/minfil.bat"})

- og der er ingen respons overhovedet! Filen kan afvikles normalt fra en DOS-prompt uden problemer.

Nogle ideer til hvad problemet kan være?
Avatar billede arne_v Ekspert
03. februar 2007 - 17:20 #1
Runtime.getRuntime().exec(new String[] {"cmd", "/c", "C:\\Java\\minfil.bat"})
Avatar billede jespersahner Nybegynder
03. februar 2007 - 17:39 #2
->arne_v: Virker heller ikke.
Avatar billede arne_v Ekspert
03. februar 2007 - 18:00 #3
læser du fra output ?
Avatar billede jespersahner Nybegynder
03. februar 2007 - 18:36 #4
->arne_v: Læser fra output? Hvad mener du her?

Konkret er .bat-filen en Java-applikation, som afvikles fint fra en DOS-prompt.
Avatar billede arne_v Ekspert
03. februar 2007 - 19:13 #5
hvis BAT filen genererer output så kan der ske fejl hvis ikke Java læser det
Avatar billede arne_v Ekspert
03. februar 2007 - 19:13 #6
hvad med default dir er det samme når du kører manuelt og fra Java ?
Avatar billede jespersahner Nybegynder
03. februar 2007 - 19:24 #7
->arne_v: bat-filen genererer også output udnervejs (det er en større applikation, der opdaterer en database m.m.).

Nej, default dir kan godt være anderledes, men dette burde vel håndteres via den eksplitte reference C:\\Java\\minfil.bat (?)

Men, men..jeg har prøvet flg. for at fange output:
Runtime rt=Runtime.getRuntime();
Process proc=rt.exec(new String[]{"cmd.exe", "C/", "C:\\Java\\minfil.bat"});
BufferedReader stdOut=new BufferedReader(new InputStreamReader(proc.getInputStream()));
String oneLine;
while ((oneLine=stdOut.readLine())!=null) {
    System.out.println(oneLine);
}
stdOut.close();                   

- hvorved flg. returneres:
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

Dette svarer til at man skriver "cmd" uden argumenter så at sige. Kan der være noget her?
Avatar billede arne_v Ekspert
03. februar 2007 - 19:25 #8
du skriver stadig forkert !


Process proc=rt.exec(new String[]{"cmd.exe", "C/", "C:\\Java\\minfil.bat"});

->

Process proc=rt.exec(new String[]{"cmd.exe", "/C", "C:\\Java\\minfil.bat"});
Avatar billede jespersahner Nybegynder
03. februar 2007 - 19:50 #9
->arne_v: Ja, det er rigtigt! Men selv når jeg retter dette til, sker der (tilsyneladende) ikke noget.

Men, men..når jeg fanger output, virker det! Altå først når output fanges, starter applikationen op (JFrame mv.). Hvad mon det handler om?
Avatar billede arne_v Ekspert
03. februar 2007 - 19:54 #10
der er en lille buffer mellem java.exe og cmd.exe

hvis den kun er på en linie så tænk som følger:

cmd.exe skriver

Microsoft Windows XP [version 5.1.2600]

den fylder buffer

cmd.exe skriver nu

(C) Copyright 1985-2001 Microsoft Corp.

men da der ikke er plads, så blocker den skrivning indtil java.exe læser fra
og dermed tømmer bufferen
Avatar billede jespersahner Nybegynder
03. februar 2007 - 20:03 #11
->arne_v: Det forklarer jo sagen. Skynd dig at smide et svar og tak for hjælpen!
Avatar billede arne_v Ekspert
03. februar 2007 - 20:04 #12
svar
Avatar billede arne_v Ekspert
03. februar 2007 - 20:08 #13
Runtime exec kan godt være lidt tricky, fordi det er en meget
OS specifik funktion

man kan kun starte en EXE ikke en shell internal kommando d.v.s. at man skal vide
om den kommando man vil køre er implementeret som en EXE eller som en internal
kommando - på window er COPY internal men XCOPY er en EXE

man skal nogen gange læse fra processen afhænger af buffer størrelse som altså
er OS specifik

på Windows kan man angive både EXE og params i en streng men ikke på Linux
p.g.a. en forskel i de OS specifikke funktioner som Runtime exec kalder
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester