luislopes Posted September 16, 2013 at 11:57 AM Report #524704 Posted September 16, 2013 at 11:57 AM 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
nelsonr Posted September 16, 2013 at 01:38 PM Report #524740 Posted September 16, 2013 at 01:38 PM 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)
luislopes Posted September 16, 2013 at 03:42 PM Author Report #524750 Posted September 16, 2013 at 03:42 PM 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 😉
nelsonr Posted September 16, 2013 at 03:51 PM Report #524751 Posted September 16, 2013 at 03:51 PM 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);
luislopes Posted September 16, 2013 at 04:01 PM Author Report #524755 Posted September 16, 2013 at 04:01 PM 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 😉
nelsonr Posted September 16, 2013 at 04:40 PM Report #524762 Posted September 16, 2013 at 04:40 PM 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(); }
luislopes Posted September 16, 2013 at 04:50 PM Author Report #524766 Posted September 16, 2013 at 04:50 PM (edited) 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" 😕 Mas com a versão inicial que falei, aquela para fazer "dir" ele encaminha o output para a textbox ... Edited September 16, 2013 at 05:07 PM by luislopes
nelsonr Posted September 16, 2013 at 05:15 PM Report #524773 Posted September 16, 2013 at 05:15 PM 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á?
luislopes Posted September 16, 2013 at 05:23 PM Author Report #524775 Posted September 16, 2013 at 05:23 PM 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 😕
nelsonr Posted September 16, 2013 at 05:26 PM Report #524776 Posted September 16, 2013 at 05:26 PM Eim? Então está no parametro do ProcessStartInfo o caminho completo, incluindo o ficheiro a executar.
luislopes Posted September 16, 2013 at 05:27 PM Author Report #524777 Posted September 16, 2013 at 05:27 PM 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"
nelsonr Posted September 16, 2013 at 05:28 PM Report #524778 Posted September 16, 2013 at 05:28 PM (edited) 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 September 16, 2013 at 05:29 PM by nelsonr
luislopes Posted September 16, 2013 at 05:33 PM Author Report #524779 Posted September 16, 2013 at 05:33 PM 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 😁 Muito Obrigado ! Agora só faltava mesmo passar o output para a textbox (porque depois tudo o que tenho de fazer é repetir este código)
nelsonr Posted September 16, 2013 at 05:34 PM Report #524780 Posted September 16, 2013 at 05:34 PM Nunca usei o phing por isso posso não estar a perceber bem como funciona. O phing não é um executavel ou batch file?
luislopes Posted September 16, 2013 at 05:41 PM Author Report #524783 Posted September 16, 2013 at 05:41 PM 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 ! 🙂
nelsonr Posted September 16, 2013 at 09:00 PM Report #524812 Posted September 16, 2013 at 09:00 PM Então mas o ficheiro "phing" não é um batch file que existe na basta C:\wamp\bin\php\php5.4.3?
luislopes Posted September 17, 2013 at 08:56 AM Author Report #524839 Posted September 17, 2013 at 08:56 AM É 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 !
nelsonr Posted September 17, 2013 at 09:07 AM Report #524843 Posted September 17, 2013 at 09:07 AM 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"
nelsonr Posted September 17, 2013 at 09:19 AM Report #524844 Posted September 17, 2013 at 09:19 AM 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
luislopes Posted September 17, 2013 at 09:20 AM Author Report #524845 Posted September 17, 2013 at 09:20 AM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now