Jump to content
luislopes

Windows Forms para executar Command Line

Recommended Posts

luislopes

Boas,

Tenho muito pouca experiência com C# e ainda menos com Windows Forms, mas preciso de criar uma aplicação com alguns botões, sendo que ao clicar em cada um dos botões, o mesmo executa um comando na linha de comandos (para executar um target do Phing).

Para além disto, preciso de alterar constantemente o caminho para certas pastas (gostaria de o fazer também na aplicação).

Alguém conhece um projeto semelhante para eu me basear ?

Obrigado

Share this post


Link to post
Share on other sites
nelsonr

Boas,

para executares comandos podes usar o Process.Start. Podes ver um exemplo aqui:

http://msdn.microsoft.com/en-us/library/53ezey2s.aspx

(tens de fazer o using do System.Diagnostics)

Não percebi isso de alterar constantemente o caminho de certas pastas, mas se for para renomear pastas, podes usar o Directory.Move

http://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx

(tens de fazer o using do System.IO)

Share this post


Link to post
Share on other sites
luislopes

Obrigado pela resposta nelsonr :)

Eu já andei a tentar meter o Process.Start a dar, mas não consigo ...

Basicamente o máximo que consegui fazer foi o mesmo que é feito neste

https://www.youtube.com/embed/7kzsTf9qPv4?feature=oembed

, cujo código é este:

Process update = new Process();
	 update.StartInfo.FileName = "cmd.exe";
	 update.StartInfo.UseShellExecute = true;
	 update.StartInfo.Arguments = "dir";
	 update.StartInfo.RedirectStandardOutput = true;
	 update.Start();
	 textBox1.Text = update.StandardOutput.ReadToEnd();
	 */

No

update.StartInfo.Arguments = "dir";

se alterar "dir" por "ipconfig" também funciona, porém se quiser fazer um cd para uma certa directoria, não consigo ! e no meu caso preciso de fazer

cd C:\wamp\bin\php\php5.4.3

Pois só nesta pasta é que posso executar o script que quero que seja executado quando clico no botão.

Em relação ao caminho das pastas, o tal ficheiro de script contém vários caminhos para diversas pastas, o objectivo é mudar esses caminhos na aplicação e os caminhos serem alterados no script (mas isso fica para depois).

Acho que fui um bocado confuso, qualquer dúvida avisem e obrigado pela ajuda ;)

Share this post


Link to post
Share on other sites
nelsonr

Qual o comando que pretendes executar mesmo?

Não dá para executares o que pretendes directamente, definindo a directoria de trabalho.

Exemplo:

var startInfo = new ProcessStartInfo("commando.exe");
startInfo.WorkingDirectory = @"C:\Pasta";
Process proc = Process.Start(startInfo);

Share this post


Link to post
Share on other sites
luislopes

Eu tenho um buildfile do Phing que executa algumas tarefas de Deploy, o objectivo é criar a aplicação para não ter de ir sempre à linha de comandos executar o script.

Na linha de comandos eu faço:

cd C:\wamp\bin\php\php5.4.3
phing

e ele executa o script.

Experimentei o que disseste desta maneira:

var startInfo = new ProcessStartInfo("phing");
	    startInfo.WorkingDirectory = @"C:\wamp\bin\php\php5.4.3";
	    Process proc = Process.Start(startInfo);

E funciona, ele abre a janela do cmd e vejo que executou (mas ela fecha logo imediatamente).

o que agora pretendia era ter o output do comando numa textbox, ou seja, queria que tudo o que aparece na linha de comandos aparece na textybox da minha aplicação . tentei desta maneira mas não deu

textBox1.Text = proc.StandardOutput.ReadToEnd();

Mas já foi um passo dado, obrigado nelson ;)

Share this post


Link to post
Share on other sites
nelsonr

Experimenta algo assim:

Process process = new Process();
process.StartInfo = new ProcessStartInfo(@"C:\wamp\bin\php\php5.4.3\phing.exe")
{
WorkingDirectory = @"C:\wamp\bin\php\php5.4.3",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
process.Start();
using (StreamReader sr = process.StandardOutput)
{
textBox1.Text = sr.ReadToEnd();
}

Share this post


Link to post
Share on other sites
luislopes

Não.. assim lança logo uma excepção...Testei também meter no ProcessStartInfo "phing", meti o CreateNoWindow a false e ele nem está a executar o comando (a janela do cmd nem aparece)...

Na outra versão ao menos sempre executa, não me direciona é o output para a textbox e dá uma excepção a dizer "StandardOut has not been redirected or the process wasn't started yet" :confused:

Mas com a versão inicial que falei, aquela para fazer "dir" ele encaminha o output para a textbox ...

Edited by luislopes

Share this post


Link to post
Share on other sites
nelsonr

Com esse exemplo não é suposto mostrar a janela de output,porque está a ser direccionada para o streamreader.

Quando se coloca a trabalhar desta forma, tem de se definir o caminho da aplicação com o nome do ficheiro a executar.

Qual é a excepção que dá?

Share this post


Link to post
Share on other sites
luislopes

Ao executar como disseste diz "The system cannot find the file specified" e a excepção é lançada no process.Start();

Mas este código tem de estar no minimo incompleto, porque para o script do Phing ser executado eu tenho de escrever "phing" na pasta "C:\wamp\bin\php\php5.4.3" e nesse código não tenho "phing" em lado nenhum :confused:

Share this post


Link to post
Share on other sites
nelsonr

Eim? Então está no parametro do ProcessStartInfo o caminho completo, incluindo o ficheiro a executar.

Share this post


Link to post
Share on other sites
luislopes

Outro problema que verifiquei agora... O meu script do Phing tem várias tasks, para as chamar faço "phing nometask", sendo que se fizer apenas "phing" irá ser executada a task predefinida.

com o código de à pouco

  var startInfo = new ProcessStartInfo("phing");
	    startInfo.WorkingDirectory = @"C:\wamp\bin\php\php5.4.3";
	    Process proc = Process.Start(startInfo);

ele abre a janela do cmd e vejo que executou a tarefa do phing predefinida (que apenas mostra todas as tarefas possiveis), se por outro lado em vez de "phing" meter "phing commit" (tarefa para fazer commit) da-me a excepção "The system cannot find the file specified"

Share this post


Link to post
Share on other sites
nelsonr

Testei aqui com um batchfile que contem apenas o dir, e funcionou bem

Podes definir os parametros com a variavel "Arguments" (colocas juntamente na parte onde está a ser definido o workingdirectory)

Edited by nelsonr

Share this post


Link to post
Share on other sites
luislopes

Eim? Então está no parametro do ProcessStartInfo o caminho completo, incluindo o ficheiro a executar.

Mas to objectivo não é abrir o .exe do Phing, é executar um ficheiro xml com algumas tarefas(feitas em Phing).

Para o fazer na linha de comandos tenho de estar dentro da pasta do php (O phing só é executado nesta pasta) e ao escrever phing ele executa o ficheiro build.xml (que é o ficheiro que contém as tarefas que escrevi)

Ok !

Fiz o que disseste agora, como queria executar "phing commit", meti no ProcessStartInfo "phing" e nos Arguments "commit" e está a dar :cheesygrin: Muito Obrigado !

Agora só faltava mesmo passar o output para a textbox (porque depois tudo o que tenho de fazer é repetir este código)

Share this post


Link to post
Share on other sites
nelsonr

Nunca usei o phing por isso posso não estar a perceber bem como funciona.

O phing não é um executavel ou batch file?

Share this post


Link to post
Share on other sites
luislopes

O Phing é um programa que permite automatizar processos.

Basicamente depois do Phing estar instalado, escreves um fichero .xml com as tarefas que o Phing tem (o nome predefinido do ficheiro é build.xml), ou seja quando executas "phing" o que ele faz é executar o ficheiro build.xml.

O que ficou agora feito já executa o que é pretendido, agora só queria encaminhar o output para a textbox.

Estou em estágio, pelo que só amanha é que volto a testar isto.

Agradeço-te imenso a ajuda, mesmo ! :)

Share this post


Link to post
Share on other sites
nelsonr

Então mas o ficheiro "phing" não é um batch file que existe na basta C:\wamp\bin\php\php5.4.3?

Share this post


Link to post
Share on other sites
luislopes

É um batch file que pode estar em qualquer pasta, mas que tem de ser executado através da pasta C:\wamp\bin\php\php5.4.3.

Se o ficheiro estiver nessa pasta e se chamar "build.xml" executo apenas "phing" senão executo "phing -f caminho_ficheiro" (já testei com vários caminhos e está a funcionar) :)

Vou ver se encontro algo que me ajude a meter o output da consola na textbox.

Mas mais uma vez, obrigado !

Share this post


Link to post
Share on other sites
nelsonr

Se é um batch file, o exemplo que dei no post #6 tem de funcionar, apenas substitui o nome do ficheiro "phing.exe" para "phing.bat".

E confirma que esse ficheiro está na pasta, sendo o caminho completo "C:\wamp\bin\php\php5.4.3\phing.bat"

Share this post


Link to post
Share on other sites
nelsonr

Já agora, se quiseres usar o exemplo inicial, podes experimentar enviar o output usando o sinal >

Exemplo:

dir >output.txt

Talvez consigas fazer "phing >output.txt", depois lês o ficheiro para a textbox

Share this post


Link to post
Share on other sites
luislopes

O ficheiro "phing.bat" existe, quer faça como dizes quer meta só "phing" o resultado está a ser o mesmo ...

Ele abre o cmd vejo que executou, mas depois lança a excepção "StandardOut has not been redirected or the process hasn't started yet" e portanto não vai output nenhum para a textbox

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.