Executar um arquivo em tempo de execução

20 respostas
B

Olá pessoas tô tentando em um botão do meu formulário rodar um arquivo bat mas ñ tô conseguindo

try {
            Runtime.getRuntime().exec("C:/arquivo.bat");
        } catch (Exception e) {
            e.printStackTrace();
        }

o q pode ser?

20 Respostas

Paulo_Schiavon

Cade o print da exception?

Eder_Peixoto

A partir da versão 1.6 do Java, executar arquivos ficou muito mais simples. Veja a especificação da classe java.awt.Desktop, em especial o método open(File). (http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html)

Para obter uma instância de Desktop, invoque o método estático getDesktop().

B
tentei isso

String backup = c:\arquivo.bat;

try {

Desktop.getDesktop().open(new File(backup));

} catch (Exception e) {

e.printStackTrace();

}

mas n funciionou

B

ele fala isso

java.lang.IllegalArgumentException: The file: c:\arquivo.bat doesn't exist.
        at java.awt.Desktop.checkFileValidation(Desktop.java:191)

e o arquivo EXISTE! e la no c:

Eder_Peixoto

Mude o seu código aqui:

String backup = "c:\arquivo.bat";

Para:

String backup = "c:" + File.separator + "arquivo.bat";

Evite o uso explícito do caracter separador de diretórios. Dê preferência para o atributo separator, da classe File.

Eder_Peixoto

Outro motivo pode ser a inexistência de privilégio para executar o arquivo.

Note que na Exception é especificada a linha 191 da classe Desktop. Verificando o código nessa linha:

190        if (!file.exists()) {
191            throw new IllegalArgumentException("The file: "
192                                               + file.getPath() + " doesn't exist.");
193        }

nota-se que ele invocou o método exists() da classe File. Consultando o código do método exists():

728    public boolean exists() {
729	     SecurityManager security = System.getSecurityManager();
730	     if (security != null) {
731	         security.checkRead(path);
732	     }
733	     return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
734    }

Na linha 729 ele obtém uma instância do SecurityManager, o qual pode estar verificando que você não possui o privilégio necessário. Mas isso é apenas uma hipótese!!!

B

Tb acredito nessa sua hipotese de privilegio pois mudei o codigo conforme vc me disse e da o mesmo erro

java.lang.IllegalArgumentException: The file: c:\arquivo.bat doesn't exist.
        at java.awt.Desktop.checkFileValidation(Desktop.java:191)

, porem como deixo ele com permissao para abrir de forma segura o meu arquivo .bat?

Eder_Peixoto

Você tentou salvar o arquivo em outro local (por exemplo, no diretório MEUS DOCUMENTOS do seu usuário) e tentar executar novamente?

Você é o ADMINISTRADOR da máquina?

Fiz alguns testes executando arquivos .bat e não obtive nenhum problema.

B

sim sou administrador da maquina e tentei colocar meu arquivo bat em otro lugar e xamar ele e da o mesmo problema simplesmente ele n abre da como arquivo n existe como pode coloquei ele na minha raiz e xamei ele e da como invalido =/ alguem ja passo por isso ?

Eder_Peixoto

Invoque o método estático isDesktopSupported(), da classe Desktop, para verificar se é suportado por sua plataforma.

Desktop.isDesktopSupported();
B

coloquei isso no meu actionperformed
Desktop.isDesktopSupported(); ele n me retorno nada!

B

tentei isso tb e url me retorna null nao sei pq

String backup = "C:" + File.separator + "arquivo.bat";
            java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
            URL url = Thread.currentThread().getContextClassLoader().getResource(backup);
            System.out.println("url = "+url);
B
java.io.IOException: Cannot run program "c:\backup\arquivo.bat": CreateProcess error=2, O sistema não pode encontrar o arquivo especificado
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)

problema continua :frowning: tentei muda de pasta

Eder_Peixoto

Invoque o método estático isDesktopSupported(), da classe Desktop, separadamente, apenas para fins de teste, sem tentar executar o arquivo bat.

Se retornar TRUE, significa que há suporte, por parte de sua plataforma, quanto ao uso de Desktop;
Se FALSE, então sua plataforma não dá suporte.

Eder_Peixoto

Isso aparentemente significa que o evento que você está escutando não foi disparado. :lol:

B
try {
            //java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
            //URL url = Thread.currentThread().getContextClassLoader().getResource(backup);
            Desktop.isDesktopSupported();
        } catch (Exception e) {
            e.printStackTrace();
        }

nao retorna nada! eh isso mesmo? o probleminha dificil esse =[

Eder_Peixoto

Ei, ei, ei…

Mas na linha 4 você está apenas invocando o método, NÃO está armazenando o resultado ou apresentando na tela, que é o nosso objetivo.

Muda o código para:

1.         try {
   2.             //java.awt.Desktop desktop = java.awt.Desktop.getDesktop();  
   3.             //URL url = Thread.currentThread().getContextClassLoader().getResource(backup);  
   4.             System.out.println( "Plataforma Suporta Desktop? " + Desktop.isDesktopSupported() );
   5.         } catch (Exception e) {  
   6.             e.printStackTrace();  
   7.         }

Note que eu incluí um System.out.println na linha 4.

Tenta de novo!!!

B

biluquinha, isDesktopSupported() retorna um boolean, ele não vai imprimir nada na tela se você não mandar imprimir.

Só uma pergunta, quando você clica duas vezes nesse arquivo.bat, ele executa um prompt de comandos ou abre um arquivo texto no bloco de notas?

Se puder abra um prompt(Iniciar->Executar-> digite cmd ou aperte Win+R), navegue até a raiz de c: onde está o teu arquivo bat, (digite c: e cd /) e use o comando dir bat, e tire um alt + print screen da janela pra gente ver.

Isso ou confirme que o arquivo é realmente um .bat

B

Plataforma Suporta Desktop? true

Bruno, ele abre o prompt de comando n abre o bloco de notas

B

AMIGOS, consegui quando dei o comando bat vi q mu arquivo estava com o nome arquivo.bat.bat, tirei o .bat e rodo com sucesso muito obrigado pela atencao de todos vcs de coracao, vlw mesmo PROBLEMA RESOLVIDO!

Criado 28 de julho de 2009
Ultima resposta 29 de jul. de 2009
Respostas 20
Participantes 4