К основному контенту

Standardoutput readtoend waitforexit


Executando Executáveis ​​de Linha de Comando em C #
O problema.
Um colega de trabalho queria construir uma ferramenta em C #, que envolve a execução de um executável de linha de comando. Como uma API não está disponível para eles, eles solicitam uma maneira rápida de iniciar um executável de linha de comando com a opção de analisar a saída padrão.
A solução.
Minha solução para eles que lhes permitirá:
Lançar uma linha de comando executável com argumentos Tem a opção de recuperar Saída Padrão Tem a opção de recuperar Erro Padrão Tem a opção de lançar exceção no Erro Padrão Encaminhar quaisquer exceções (ex: executável não existe)

Standardoutput readtoend waitforexit
Eu corro ffmpeg assim:
. mas o problema é que o console com o ffmpeg aparece e desaparece de imediato, então não consigo nenhum feedback. Eu nem sei se o processo foi executado corretamente.
Então, como eu posso:
Diga ao console para ficar aberto.
Recupere no C # o que o console exibiu.
O que você precisa fazer é capturar o fluxo de saída padrão:
Você também pode precisar fazer algo semelhante com o StandardError. Você pode então fazer o que quiser com q.
É um pouco meticuloso, como descobri em uma das minhas perguntas.
Como Jon Skeet apontou, não é inteligente usar a concatenação de strings como essa; você deve usar um StringBuilder:
A resposta de Lucas tem uma condição de corrida: se o processo terminar rapidamente, o loop while será deixado (ou nunca será inserido) mesmo que ainda haja alguma saída, ou seja, você poderá perder alguns dados. Para evitar isso, outro ReadToEnd deve ser feito após o processo ter sido encerrado.
(Observe que, em comparação com a versão antiga da minha resposta, não consigo mais ver a necessidade de WaitForExit quando a sinalização process. HasExited for verdadeira, então isso se resume a :)
Para uma resposta mais específica diretamente relacionada ao ffmpeg, passar o comando "-report" para o ffmpeg fará com que ele faça um log no diretório atual com o que foi dito na exibição do processo.
Descarregue a linha de comando completa e a saída do console em um arquivo denominado program-YYYYMMDD-HHMMSS. log no diretório atual. Este arquivo pode ser útil para relatórios de bugs. Também implica - loglevel verbose.
Nota: configurar a variável de ambiente FFREPORT para qualquer valor tem o mesmo efeito.
Eu sei que esta pergunta é antiga, mas vou acrescentar de qualquer maneira.
Se tudo o que você deseja fazer é exibir a saída de um processo de linha de comando e gerar o processo a partir de uma janela do console, basta redirecionar a entrada padrão (sim, sei que parece errado, mas funciona).

paperknots.
Sorrir! Você está no melhor site de todos os tempos.
Instalar o DotNet Fx 3.5 (pág. 3.0 e 2.0) a partir do DVD do Windows 8 utilizando o DISM.
Ontem eu tinha instalado o Microsoft Windows 8 Professional. A instalação feita foi limpa, removendo o Microsoft Windows 7 Home e formatando meu C: Drive.
Depois que a instalação foi concluída com êxito, comecei a instalar meus drivers, que estavam no meu Dell Resource DVD, que acompanhava o meu laptop anteriormente.
Ao instalar o software dos meus drivers, eu vim com isto:
Fiquei desapontado que nenhum dos meus softwares de driver foram autorizados a instalar em pular esta caixa de diálogo.
Como eu não tinha a configuração para essa estrutura, realizei algumas pesquisas no Google e descobri que o DVD do Windows 8 foi configurado para esse recurso.
A instalação do framework a partir do DVD pode ser feita usando o DISM Utility (ferramenta Gerenciamento e Manutenção de Imagens de Implantação).
Esse recurso pode ser instalado por:
Etapas a serem executadas:
Inicie o prompt de comando do Windows (cmd. exe) no modo Administrador (pressione Ctrl + Esc → digite & # 8220; cmd. exe & # 8221; em pesquisa → pressione Ctrl + Shift + Enter selecionando & # 8220; cmd. exe & # 8221 ;. ) Digite o comando: dism / online / enable-feature / nome da tarefa: NetFX3 / LimitAccess / All / Source: & # 8220; caminho para a pasta SXS & # 8221; e pressione enter. Se tudo estiver bem, então mostrará "& # 8220; Operações concluídas com sucesso & # 8220 ;. Reinicie o seu PC para aplicar as alterações.
Podemos programar um aplicativo no Microsoft 4.5 C #, que pode interagir com a ferramenta DISM e instalar recursos do DVD do Windows.
Inicie o Microsoft Visual Studio 2012 → Criar novo projeto em C # → selecione Windows Application nos modelos disponíveis. Arraste e solte dois controles de caixa de texto e dois botões da caixa de ferramentas. Além disso, adicione o controle folderBrowserDialog da caixa de ferramentas. Nomeie um botão Navegue e adicione o seguinte código ao botão no código por trás do arquivo.
Aqui, o código contém o seguinte:
folderBrowserDialog = Caixa de diálogo usada para selecionar pastas. txtFolderPath = Caixa de texto que mostra o caminho da pasta retornado por folderBrowserDialog. txtOutput = Caixa de texto que mostra a saída que será retida pelo prompt de comando.
Assembly: System (no System. dll)
CreateNoWindow = Quando definido como True não mostrará a janela do processo que está sendo executado. FileName = Nome do arquivo que queremos executar. Argumentos = os argumentos que serão anexados junto com o FileName quando o processo for iniciado. UseShellExecute = Quando definido como false se você deseja definir RedirectStandardOutput como true. Caso contrário, a leitura do fluxo StandardOutput gerará uma exceção. RedirectStandardOutput = Definido como verdadeiro, envia a saída para fluxo, onde pode ser lido usando Read, ReadLine e ReadToEnd. Start () = inicia o processo. ScrollToCaret () = use para rolar até o final da caixa de texto de várias linhas (ele responde apenas quando a caixa de texto está focada.) WaitForExit () = o aplicativo aguarda o processo concluir sua execução. Close () = fecha e libera os recursos usados ​​pelo processo.

C # ADB 디바이스 잡기 소스.
private void btnTarget_Click (remetente do objeto, EventArgs e) // 버튼 클릭 시.
string privada SearchADBFilename ()
// 블루 스택 설치된 폴더 로 찾기.
ADBFilename = string. Format (@ & # 8221; \ BlueStacks \ HD-Adb. exe & # 8221 ;, Environment. GetEnvironmentVariable (
(8 == IntPtr. Size ||! String. IsNullOrEmpty (Environment. GetEnvironmentVariable (& # 8220; PROCESSOR_ARCHITEW6432 & # 8221;)))?
ADBFilename = string. Format (@ & # 8221; \ Nox \ bin \ nox_adb. exe & # 8221 ;, Environment. GetEnvironmentVariable (& # 8220; APPDATA & # 8221;));
Listar & lt; Processar & gt; processos = novo List & lt; Process & gt; ();
if (processes. Count & gt; 0)
string ADBName = nulo;
ADBFilename = string. Format (& # 8220;.exe & # 8221 ;, ADBFilename. Remove (ADBFilename. LastIndexOf (& # 8220; \\ & # 8221;) + 1), ADBName);
private void UpdateDeviceList ()
string ADBFilename = SearchADBFilename ();
Sys. cmdProcessInfo = new ProcessStartInfo ()
string result = Sys. cmdProcess. StandardOutput. ReadToEnd ();
string [] deviceList = result. Split (nova string [], StringSplitOptions. RemoveEmptyEntries);
para (int i = 1; i & lt; deviceList. Length; i ++)
string deviceSerialNumber = deviceList [i].Remover (deviceList [i].IndexOf (& # 8220; \ t & # 8221;));

Use o PsExec com o Jenkins.
Contexto: No meu teste de unidade (usando MSTest & C #) eu preciso invocar um comando IISRest para uma máquina remota. Estamos usando o Jenkins para nosso processo de integração contínua e todos os meus testes estão sendo executados no Jenkins.
Problema que enfrentei: Eu escolho o PsExec para executar o comando na máquina remota. Abaixo está o código C # que eu adicionei ao meu método de teste para isso.
Este funcionou bem se eu rodasse isso no Visual Studio.
História triste: Agora eu copiei minha MSTest dll para o escravo Jenkins e através do plugin MSTest eu estava tentando executar o mesmo teste de Jenkins UI. Mas sempre me deu esse erro & # 8211; & # 8220; PsExec saiu com o código de erro 1326. & # 8221; Este erro é enviado para credencial inválida.
O que todas as coisas que eu tentei: eu tentei acrescentar - s, - h mas nada ajudou. Meu serviço escravo Jenkins está sendo executado em uma conta de usuário que também tem acesso de administrador na máquina remota.
Solução alternativa que recebi: Após solucionar problemas por volta de 4 a 5 horas, obtive esta solução & # 8211;
Crie um arquivo. bat e coloque o argumento inteiro nele, incluindo o PSExec e a credencial. Crie uma tarefa de agendamento do Windows em seu escravo Jenkins e chame esse arquivo de lote Execute manualmente sua tarefa de agendamento e certifique-se de que as coisas estão sendo executadas na máquina remota Agora adicione código C # para chamar sua tarefa de agendamento. Abaixo está o código para referência.
Isso está funcionando bem com Jenkins. Então, se você quiser tentar qualquer coisa usando o PsExec + Jenkins, você pode fazer isso de maneira diferente. Caso você encontre alguma outra solução, por favor, poste como um comentário. Codificação Feliz.

Exemplo de uso.
Eu resolvi assim:
Eu redirecionei tanto a entrada, saída e erro e lidou com a leitura de fluxos de saída e erro. Essa solução funciona para o SDK 7- 8,1, tanto para o Windows 7 quanto para o Windows 8.
Eu tentei fazer uma classe que resolveria seu problema usando leitura de fluxo assíncrona, levando em consideração Mark Byers, Rob, stevejay respostas. Ao fazer isso, percebi que há um erro relacionado à leitura do fluxo de saída do processo assíncrono.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não foi iniciado.
Então você precisa iniciar a leitura assíncrona após o processo ser iniciado:
Fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de defini-los como assíncronos:
Então, algumas pessoas podem dizer que você só precisa ler o fluxo antes de defini-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e o fluxo em modo assíncrono.
Não há como obter uma leitura assíncrona segura de um fluxo de saída de um processo na maneira real como "Process" e "ProcessStartInfo" foram projetados.
Provavelmente, é melhor usar a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que pode perder alguma informação devido à condição de corrida.
Nenhuma das respostas acima está fazendo o trabalho.
A solução Rob trava e a solução 'Mark Byers' obtém a exceção descartada (tentei as "soluções" das outras respostas).
Então decidi sugerir outra solução:
Este código depurado e funciona perfeitamente.
Introdução.
A resposta aceita atualmente não funciona (gera exceção) e há muitas soluções alternativas, mas nenhum código completo. Isto é, obviamente, desperdiçando muito tempo das pessoas, porque esta é uma questão popular.
Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi o código completo com base em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos do git. É assim que eu usei:
Em teoria, você também pode combinar stdout e stderr, mas eu não testei isso.
As outras soluções (incluindo EM0s) ainda estão em deadlock para meu aplicativo, devido a tempos limite internos e ao uso de StandardOutput e StandardError pelo aplicativo gerado. Aqui está o que funcionou para mim:
Editar: adicionada inicialização do StartInfo ao exemplo de código.
Este post talvez desatualizado, mas eu descobri a causa principal porque normalmente travar é devido ao estouro de pilha para a saída redirectStandard ou se você tiver redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de interrupção, pois ainda está sendo processado por duração indefinida.
então, para resolver esse problema:
Eu acho que essa é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas o motivo era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A linha a seguir parece ter causado o problema.
A solução foi NÃO desabilitar o UseShellExecute. Eu agora recebi uma janela popup do Shell, que é indesejada, mas muito melhor do que o programa esperando que nada de especial aconteça. Então eu adicionei a seguinte solução para isso:
Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar.
Eu sei que esta é a ceia de idade, mas, depois de ler esta página inteira, nenhuma das soluções estava funcionando para mim, embora eu não tenha tentado Muhammad Rehan como o código foi um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou isso não é inteiramente verdade, às vezes funcionaria bem, eu acho que é algo a ver com o comprimento da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim foi usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.
Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, isso não resolveu todos os meus problemas.
Em nosso ambiente, temos um serviço do Windows que está programado para executar centenas de arquivos. bat. cmd. exe diferentes. etc arquivos que se acumularam ao longo dos anos e foram escritos por muitas pessoas diferentes e em diferentes estilos. Nós não temos controle sobre a escrita dos programas & amp; scripts, somos responsáveis ​​apenas pelo agendamento, execução e geração de relatórios sobre sucesso / falha.
Então eu tentei praticamente todas as sugestões aqui com diferentes níveis de sucesso. A resposta de Marko foi quase perfeita, mas quando executada como um serviço, nem sempre captava stdout. Eu nunca cheguei ao fundo do por que não.

Комментарии

Популярные сообщения из этого блога

Sygnaly forex opinie toyota

Aktualny stan ukazuje dalszy potencja do wzrostw Wsparcie na 20,50 zamienia si w trampolin do wzrostu Trzymamy si adnie powyej poziomu otwarcia. taka adna wieczka si robi Mam nadziej e zakoczymy dzie na poziomie 21,40-21,50 bo wieca bdzie jeszcz adniejsza porwnywaem poprzedni wzrost i upadek zgodny z analogi. para inna bajka tam szybko spado po wzrocie a tu nadal spore obroty i poziom przyzwoity Odkupiem POLREST bo poaowaem moliwych na faixa de estilo (tym razem po 0,88 gr wic 7 gr mi ucieko (10 meses atrás :))) dzi chyba te bdzie tam 30 dias atrás não pare eu não sei o que você está fazendo 5 minutos tam jednak jest kierunek wyszy eu dopki nie dojad fazer min 1 z lub 1,20 para bd ir pchali. OPTIMUS jednak przepaciem. kupujc po 3,17 :) ale para nie wielki pakiet w moim portfelu wic praktycznie bez znaczenia. czysta spekulacja EDIÇÃO INTERATIVA CITY: 15:15 znw Bart powiesz e spadki jak zwykle ogaszam :) niestety porwnujc ostatnio wzrost i upadek ju bardziej si zgadza szkoda e nie sprzed...

Sistema de comércio roblox hack

Perguntas frequentes. Nós temos algumas respostas para você. Idealmente, gostaríamos que o nosso site continuasse a funcionar pelo maior tempo possível. Portanto, devemos ter cuidado para não divulgar qualquer informação específica sobre como operamos que possa ser usada pelo Roblox para corrigir o bug. O que podemos afirmar é que nosso site utiliza a exploração em seu sistema para verificar instantaneamente se a sua conta do Roblox existe antes de adicionar a conta do Robux e / ou do Builders Club à sua conta. Não. Este site permanecerá sempre sem fins lucrativos, com o único propósito de fornecer aos jogadores menos afortunados do Roblox que não podem pagar preços exorbitantes. Colocamos anúncios no site para financiar os altos custos do servidor e manter o site funcionando. Não entre em pânico! Nosso site é muito popular e nossos servidores geralmente acham difícil acompanhar os pedidos. Nosso objetivo é entregar a sua associação ao Robux e ao Builders Club em 10 minutos, no entanto...

Opiniões sobre forex income boss

CurrencyPips. Ferramentas de Marketing Online e Revisões de Treinamento. Revisão de chefe de renda de Forex. Revisão completa do chefe do rendimento dos estrangeiros do chifre de Russ + disconto extra do bônus de $ 200. O que é o Forex Income Boss? É Forex Scam Boss Scam ou Verdade? Quais são as características do Forex Income Boss? Revisão completa de Russ Horn Horn Income Boss. O que é o Forex Income Boss? É Forex Scam Boss Scam ou Verdade? Quais são as características do Forex Income Boss? O Forex Income Boss da Russ Horn é verdadeiramente único, extremamente preciso e com a melhor relação custo-benefício. Russ Horn Forex Income Boss é o maior sistema de negociação Forex de 2015. Leia revisão completa, ajuda a aprender mais sobre Forex Income Boss antes de comprá-lo. Nome do Produto: Forex Income Boss. Tipo de produto: Produto físico. Sub-Nicho: Sistema de Negociação / Curso. Método de entrega: entregue para o endereço do comprador registrado. Site Oficial: Forex Income Boss. Data d...