Redireccionar o padrão de saída de espera aguardando


redireccionar a saída de arquivo aguardando
Obter através da App Store Leia esta publicação em nosso aplicativo!
ProcessInfo e RedirectStandardOutput.
Eu tenho um aplicativo que chama outro processo em uma janela de comando e esse processo possui estatísticas de atualização que são enviadas para a janela do console. Eu pensei que esta era uma operação bastante simples, mas não consigo conseguir que funcione. Estou esquecendo de algo?
Idealmente, o que eu gostaria é que o resultado muda dentro desse processo que eu acertei ou os dados entram no leitor que eu obtenho eventos fora dele.
Qualquer ajuda seria excelente, eu sinto que esta é uma questão de novato, mas parece estar faltando alguma coisa.
Já experimentei isso antes. Às vezes, a forma como o processo que você está chamando de saídas para o console não é compatível com esse tipo de redirecionamento de saída. Naquele caso, tive a sorte de poder modificar o processo externo para evitar isso.
Você pode tentar executar seu código em outro processo que saia para o console e veja se ele funciona corretamente. Ele me lê direito agora.
Eu fui e puxei um bloco de código que eu costumava fazer. Isso está em um aplicativo WPF que redireciona a saída do processo para a janela. Observe a ligação do evento. Como isso é WPF, tenho que invocar minha chamada para escrever os dados. Como você não está preocupado com o bloqueio, você pode simplesmente substituir isso por:
Espero que ajude!
Não tenho certeza exatamente sobre o problema em que você está executando, mas se você estiver olhando para atuar no resultado assim que for gerado, tente se conectar ao evento OutputDataReceived do processo. Você pode especificar manipuladores para receber saída de forma assíncrona do processo. Eu usei essa abordagem com sucesso.
Consulte o evento OutputDataReceived Off Process para obter mais informações.
Usando expressões lambda, etc.:
Curiosamente, você não pode ler de saída padrão e erro padrão ao mesmo tempo:
se você redirecionar a saída padrão e o erro padrão e tente ler ambos, por exemplo, usando o seguinte código C #.
string output = p. StandardOutput. ReadToEnd ();
string error = p. StandardError. ReadToEnd ();
Nesse caso, se o processo filho escrever qualquer texto para erro padrão, ele bloqueará o processo, porque o processo pai não pode ler de erro padrão até que ele tenha terminado a leitura da saída padrão. No entanto, o processo pai não será lido a partir da saída padrão até o processo terminar. Uma solução recomendada para esta situação é criar dois tópicos para que seu aplicativo possa ler a saída de cada fluxo em um segmento separado.
O código de fluxo funcionou no VS2010.
Verifique se a saída que você espera não está sendo enviada para a saída StandardError em vez da saída StandardOutput.

Exemplo de uso.
Resolvi assim:
Eu redirecionava a entrada, a saída e o erro e administrai a leitura dos fluxos de saída e erro. Esta solução funciona para o SDK 7- 8.1, tanto para o Windows 7 como para o Windows 8.
Eu tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um erro relacionado à leitura assíncrona do fluxo de saída do processo.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não começou.
Então, você deve iniciar a saída assíncrona lida 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 configurá-lo como assíncrono:
Então algumas pessoas podem dizer que você só precisa ler o fluxo antes de configurá-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono.
Não há como conseguir uma leitura assíncrona segura de um fluxo de saída de um processo na forma real "Processo" e "ProcessStartInfo" foi projetado.
Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações 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 descarta. (Eu tentei as "soluções" das outras respostas).
Então eu decidi sugerir outra solução:
Este código é depurado e funciona perfeitamente.
Eu acho que isso é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema.
A solução era NÃO desativar UseShellExecute. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso:
Agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar.
Introdução.
A resposta atualmente aceita não funciona (lança exceção) e há muitas soluções alternativas, mas nenhum código completo. Isso é, 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 um código completo baseado em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos git. É assim que eu usei isso:
Em teoria, você também pode combinar stdout e stderr, mas não testei isso.
Eu sei que isso é velho, mas, depois de ler toda essa página, nenhuma das soluções estava funcionando para mim, embora eu não tentei Muhammad Rehan porque o código era 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, acho que é algo a ver com a duração da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim era 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!
As outras soluções (incluindo o EM0) ainda estão bloqueadas para o meu aplicativo, devido a tempos de espera internos e ao uso de StandardOutput e StandardError pela aplicação gerada. Aqui está o que funcionou para mim:
Editar: inicialização adicionada de StartInfo para codificar a amostra.
Este post talvez esteja desactualizado, mas descobri a principal causa por que normalmente ele trava é devido ao excesso de pilha para o redirectStandardoutput ou se você tem redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de espera, pois ele ainda está processando por tempo indefinido.

redireccionar a saída de arquivo aguardando
Sugiro que você leia a seção de observações da propriedade Process. StandardOuput:
HTH Tom Shelton.
Proposta como resposta por Cor Ligthert MVP terça-feira, 02 de fevereiro de 2010 18:06 Marcado como resposta por Martin_Xie Moderador segunda-feira, 08 de fevereiro de 2010 3:12 AM.
Todas as respostas.
Isso está sob seu controle. Qual é o código para os wrappers que você está escrevendo e como o código que você usou para o wrapper para o terceiro módulo é diferente do código que você usou para os wrappers para os outros dois módulos?
Public Sub Execute ()
Dim fs As System. IO. Stream.
Dim proc As New Process.
Dim szResult As String.
Dim szPath As String.
'*** GENERAR DADOS DE BOLAS.
szPath = Me. WorkingDir & amp; Meu. Settings. BallGenResultFile.
Se eu. KillBeforeExecute Then.
Catch ex As FileNotFoundException.
'Ignore a exceção do arquivo não encontrado.
Proc. StartInfo. FileName = My. Settings. BallGenExec.
proc. StartInfo. WorkingDirectory = Me. WorkingDir.
Se não proc. WaitForExit (My. Settings. BallGenTimeout), então.
Jogue Nova MsExecuteException (My. Settings. BallGenModule, & quot; Timeout esperando que BallGen termine a execução & quot;)
Se String pare (szResult. Trim, My. Settings. BallGenNormalExit. Trim, True) & lt; & gt; 0 Então.
Jogue Nova MsExecuteException (My. Settings. BallGenModule, szResult)
Se não System. IO. File. Exists (szPath), em seguida.
Jogue Nova MsExecuteException (My. Settings. BallGenModule, & quot; O arquivo de resultado BallGen não foi criado & quot;)
'*** BALL GEN SUCESSO.
'*** GENERAR DADOS DE PAREDE.
szPath = Me. WorkingDir & amp; My. Settings. WallGenResultFile.
Se eu. KillBeforeExecute Then.
Catch ex As FileNotFoundException.
'Ignore a exceção do arquivo não encontrado, lance todas as outras exceções.
proc = New Process.
proc. StartInfo. FileName = My. Settings. WallGenExec.
proc. StartInfo. WorkingDirectory = Me. WorkingDir.
Se não proc. WaitForExit (My. Settings. WallGenTimeout), então.
Jogue Novas MsExecuteException (My. Settings. WallGenModule, & quot; Timeout aguardando WallGen para concluir a execução & quot;)
Se não System. IO. File. Exists (szPath), em seguida.
Throw New MsExecuteException (My. Settings. WallGenModule, & quot; O arquivo de resultados do WallGen não foi criado & quot;)
Sugiro que você leia a seção de observações da propriedade Process. StandardOuput:
HTH Tom Shelton.
Proposta como resposta por Cor Ligthert MVP terça-feira, 02 de fevereiro de 2010 18:06 Marcado como resposta por Martin_Xie Moderador segunda-feira, 08 de fevereiro de 2010 3:12 AM.
Isso ajuda? Se você tiver mais dúvidas ou preocupações, sinta-se à vontade para nos informar.
Além disso, aqui está um artigo que demonstra: Como redirecionar Input-Output padrão de uma aplicação em.
Obrigado a todos por sua ajuda e apoio amigável.
Se você tiver algum comentário sobre o nosso suporte, entre em contato com msdnmgmicrosoft.
Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn.

redireccionar a saída de arquivo aguardando
Eu começo um processo para executar o PsExec assim:
PsExec é executado normalmente, mas process. WaitForexit (120000) não saem antes do tempo limite e a saída padrão possui apenas as 3 primeiras linhas de saída do PsExec.
Se eu definir redirectStandardOutput para falso, não importa.
Você poderia me ajudar?
Todas as respostas.
Com base no meu entendimento, o método Process. WaitForExit (int32) não significa sair quando o tempo limite.
A sobrecarga WaitForExit (Int32) é usada para fazer o thread atual aguardar até o processo associado terminar. Essa sobrecarga instrui o componente Processo a aguardar uma quantidade limitada de tempo para que o processo saia. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Processar. WaitForExit (Int32) irá comportar-se da mesma forma que a sobrecarga WaitForExit.
Se você quiser fechar o processo, você pode usar o seguinte código para fazer o que desejar:
Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda.
Sim, mas não é Process. WaitForExit (Int32) que não funciona. Esta função funciona muito bem com muitos executáveis.
O problema é que esta função não funciona com o PsExec e um redirecionamento de saída padrão. Só funciona sem usar o redirecionamento ou sem usar um tempo limite.
Não tenho certeza por que você quer usar o trabalho de chave e por que você deseja redirecionar somente quando o processo for iniciado?
Experimente o seguinte código:
Para modificá-lo como seu pedido. Pode funcionar bem. Aqui está o resultado:
Quanto maior o tempo (120000) que você configurou, mais informações você obterá. Então eu sugiro que você use o processo. WaitForExit (); método sem parâmetros. Obrigado. Vin Jin [MSFT]
Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda.
Obrigado pela ajuda.
Se eu usar process. WaitForExit () sem tempo, está funcionando muito bem e eu tenho a saída completa.
Mas eu uso psexec para executar um kit de instalação remotamente, esta configuração pode congelar o processo, então eu preciso ter um tempo limite e não quero usar a opção - d (Não espere que o processo termine) porque eu tenho o próximo passos para executar após a configuração.
Eu tentei com 300000, é o mesmo comportamento. Embora meu processo de instalação demore menos de 60000.
O problema não é a duração do tempo limite. O problema é que um redirecionamento de saída padrão e uma execução com um tempo limite congelam o processo psexec (apenas psexec, e não outro).
Oi, eu sei que esta é uma postagem antiga, mas tive esse mesmo erro ao tentar executar um processo usando o comando WaitFor () & # 43; RedirectStandardOutput e irá pendurar indefinidamente.
Encontrei uma solução para o meu problema em uma postagem no blog de Lucian Wischik, MSFT.
se você não encontrou uma solução, ou qualquer outra pessoa que pesquisasse esse problema específico deveria dar uma olhada neste endereço:
Aqui está uma cópia de seu código traduzido em C #.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn.

Comments

Popular Posts