Processo outputdatareceived waitforexit
Process outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
c # ProcessStartInfo. Start - leitura de saída, mas com tempo limite.
Se você quiser iniciar outro processo e aguardar (com o tempo limite) para concluir, você pode usar o seguinte (do MSDN).
Se você quiser iniciar outro processo e ler sua saída, então você pode usar o seguinte padrão (de SO)
Como você pode combinar os dois para ler todas as entradas, não ficar preso no deadlock e ter um tempo limite se o processo de execução der errado?
Essa técnica será interrompida se o buffer de saída for preenchido com mais de 4KB de dados. Um método mais infalível é registrar os delegados para serem notificados quando algo é escrito no fluxo de saída. Eu já sugeri este método antes em outro post:
Você não precisa combinar os dois - a classe Process tem um evento que é acionado quando a saída é enviada para o StandardOutput - OutputDataReceived.
Se você assinar o evento, você poderá ler a saída quando ela chegar e, no seu loop de programa principal, você ainda pode esperar o tempo limite.
Você pode tentar modificar o primeiro método para algo assim.
Você também pode usar o APM, assim:
Defina um delegado para a chamada ReadToEnd:
Em seguida, use o delegado para chamar o método como este:
EDITAR: tratamento de erros removido por clareza.
Basta adicionar tudo do primeiro exemplo abaixo da chamada WaitForExit () para o segundo exemplo.
Process outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process Wait for Exit não funciona.
Estou usando o código abaixo para baixar do youtube usando o script youtube-dl python.
Eu usei o processo dessa maneira porque quero ter a porcentagem do script youtube-dl para mostrar na barra de progresso do lado do cliente.
Mas existem alguns problemas e é que o WaitForExit não está funcionando. Eu li de outros tópicos que esta questão está relacionada a esperar no processo não está funcionando para o processo filho (quero dizer, no meu caminho, a espera para a saída funciona para python não para o script youtube-dl)
O que devo fazer?
Como você está interessado em um processo filho, talvez tente pesquisar no processo do youtube usando o método:
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.
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.
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.
para resolver esse problema:
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.
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!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, não resolveu todos os meus problemas.
Em nosso ambiente, temos um Serviço do Windows que está programado para executar centenas de diferentes. bat. cmd. exe. etc arquivos que se acumularam ao longo dos anos e foram escritas por muitas pessoas diferentes e em diferentes estilos. Não temos controle sobre a redação dos programas e programas; scripts, somos apenas responsáveis pelo agendamento, execução e relatórios sobre o 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 executado como um serviço, ele nem sempre captou stdout. Nunca cheguei ao fundo do porquê não.
Process outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
C # obter saída do processo durante a execução.
Existe de qualquer forma para redirecionar a saída padrão de um processo gerado e capturá-lo como acontecendo. Tudo o que vi apenas faz um ReadToEnd após o processo ter terminado. Gostaria de obter o resultado quando estiver sendo impresso.
Use Process. OutputDataReceived evento do processo, para receber os dados que você precisa.
Então, depois de um pouco mais de escavação descobri que ffmpeg usa stderr para saída. Aqui está o meu código modificado para obter o resultado.
Processo outputdatareceived waitforexit
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
Aqui está a minha função de lançamento:
Estou violando o modelo de Threading Powershell? Obrigado!
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Todas as respostas.
Eu acredito que você tenha alguns erros de digitação em seu código. Eu sou a pessoa mais humilde que você já conheceu.
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Na verdade, a menos que você queira criar um evento delegado. Mas, então, isso é o PowerShell, não é o VB.
Você pode começar aqui e ver se o evento que você está procurando pode ser "conectado"
Ajude Register-ObjectEvent - full.
Editado por jrv terça-feira, 27 de setembro de 2011 15:22.
A resposta marcada não resolve o problema com o qual o OP está lutando - isto é, redirecionando StdErr e StdOut e sofre com o bug de conflito discutido aqui:
Uma condição de impasse pode resultar se o processo pai chamar p. WaitForExit antes de p. StandardOutput. ReadToEnd e o processo filho grava texto suficiente para preencher o fluxo redirecionado. O processo pai esperaria indefinidamente para que o processo filho saísse. O processo infantil esperaria indefinidamente para o pai ler do fluxo de StandardOutput completo. & Quot;
Eu também estou tentando a melhor resposta para fazer isso funcionar no Powershell, mas todos os exemplos de código que estou executando, que utilizam System. Diagnostics. Process em powersehll são replicando o impasse nesta implementação ou não estão redirecionando stderr e stdout.
A solução em que estou indo usa o cmdlet Start-Process da seguinte maneira:
Não é uma ótima solução, pois só redirecionará stdout e stderr para um arquivo de texto. mas funcionará o tempo todo e redirecionará stdout e stderr.
Se nós vamos usar a saída redirecionada, não usaremos a espera. Esse foi o design do CreateProcess desde NT4.
O uso de arquivos para capturar a saída funcionará porque um fluxo é anexado que publica uma leitura constante para o fluxo de saída. O fluxo de saída nunca é suspenso. Yu não pode fazer isso em um loop de código. O fluxo corre o sistema do sistema do pecado Eu acredito e sempre terei uma chance de ler. A espera está no seu segmento para que você não consiga ler manualmente. É um impasse como afirmado.
O uso da leitura do console é geralmente porque estamos à procura de um prompt. Nesse caso, nunca esperamos a conclusão. O código ZTHe provavelmente será enviado para 'quit' e nós iremos verificar o processo e girá-lo até que ele seja desligado.
A questão aqui é que não podemos gerar um Thead. Em VB ou C #, C, usaríamos apenas threads de separação para IO e um para espera. Melhor ainda, eu usaria um semáforo, pois pode dinamicamente capturar um desligamento inesperado.
Talvez a próxima versão do PowerSHell tenha boas possibilidades de multithreading.
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Certo. O PowerShell é propositadamente limitado para torná-lo mais seguro para a população em geral e para reduzir os problemas que ocorrem com as linguagens compiladas.
Sim - o sinalizador de espera ajudaria, pois o arquivo pode não ter terminado o spool antes do programa encerrar.
Start-Process é um wrapper fraco na API do processo, mas protege os desavisados dos deadlocks porque você não pode redirecionar a entrada, exceto de um arquivo.
Você não precisa - venha para redirecionar. Você precisa de aguardar os arquivos e como uma maneira fácil de detecção de terminação. Usando a API, isso tem que ser feito consultando o objeto de processo ou extraindo a saída e aguardando que o processo envie sua mensagem de término e então gire o status.
Isso é muito demais para os scripts de administração e, como você apontou, não os levará a nenhum problema.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Desculpe, mas este tópico foi fechado por 5 anos. Você precisa iniciar seu próprio tópico.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Oi, você encontrou a solução? Eu tenho o mesmo problema :(
A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.
Process outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
O processo assíncrono é iniciado e aguarde que ele termine.
Eu sou novo no modelo de thread em. O que você usaria para:
iniciar um processo que lida com um arquivo (process. StartInfo. FileName = fileName;) aguarde até que o usuário feche o processo ou abandone o segmento depois de algum tempo se o usuário fechou o processo, exclua o arquivo.
Iniciando o processo e aguardando deve ser feito em um segmento diferente que o segmento principal, porque esta operação não deve afetar o aplicativo.
O meu aplicativo produz um relatório html. O usuário pode clicar com o botão direito do mouse em algum lugar e dizer "Exibir Relatório" - agora recupero o conteúdo do relatório em um arquivo temporário e inicio o processo que lida com arquivos html, ou seja, o navegador padrão. O problema é que não consigo limpar, ou seja, eliminar o arquivo temporário.
"e espera deve ser assíncrono" - eu não estou tentando ser engraçado, mas isso não é uma contradição em termos? No entanto, como você está iniciando um processo, o evento Exit pode ajudar:
Se você quiser realmente esperar (tempo limite, etc.), então:
Para esperar assíncrono, talvez apenas use um tópico diferente?
Adicionando uma alternativa avançada a esta velha pergunta. Se você quiser esperar que um processo seja encerrado sem bloquear nenhum segmento e ainda suportar tempos limite, tente o seguinte:
Novamente, a vantagem dessa abordagem em comparação com a resposta aceita é que você não está bloqueando nenhum encadeamento, o que reduz a sobrecarga do seu aplicativo.
Experimente o seguinte código.
Provavelmente não usaria um processo separado para abrir um arquivo. Em vez disso, provavelmente utilizaria um thread de segundo plano (se eu pensasse que a operação levaria muito tempo e possivelmente bloquearia o thread da interface do usuário).
Claro, este não é um bom exemplo de trabalho (não retorna nada) e não mostrei como a UI é atualizada (você precisa usar BeginInvoke no nível de UI porque um thread de fundo não pode atualizar o segmento de UI). Mas essa abordagem geralmente é como eu administrai operações assíncronas.
Você pode usar o evento Exited na classe Process.
e nesse caso você pode lidar com as operações que você mencionou.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process Wait for Exit não funciona.
Estou usando o código abaixo para baixar do youtube usando o script youtube-dl python.
Eu usei o processo dessa maneira porque quero ter a porcentagem do script youtube-dl para mostrar na barra de progresso do lado do cliente.
Mas existem alguns problemas e é que o WaitForExit não está funcionando. Eu li de outros tópicos que esta questão está relacionada a esperar no processo não está funcionando para o processo filho (quero dizer, no meu caminho, a espera para a saída funciona para python não para o script youtube-dl)
O que devo fazer?
Como você está interessado em um processo filho, talvez tente pesquisar no processo do youtube usando o método:
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.
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.
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.
para resolver esse problema:
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.
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!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, não resolveu todos os meus problemas.
Em nosso ambiente, temos um Serviço do Windows que está programado para executar centenas de diferentes. bat. cmd. exe. etc arquivos que se acumularam ao longo dos anos e foram escritas por muitas pessoas diferentes e em diferentes estilos. Não temos controle sobre a redação dos programas e programas; scripts, somos apenas responsáveis pelo agendamento, execução e relatórios sobre o 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 executado como um serviço, ele nem sempre captou stdout. Nunca cheguei ao fundo do porquê não.
Process outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
C # obter saída do processo durante a execução.
Existe de qualquer forma para redirecionar a saída padrão de um processo gerado e capturá-lo como acontecendo. Tudo o que vi apenas faz um ReadToEnd após o processo ter terminado. Gostaria de obter o resultado quando estiver sendo impresso.
Use Process. OutputDataReceived evento do processo, para receber os dados que você precisa.
Então, depois de um pouco mais de escavação descobri que ffmpeg usa stderr para saída. Aqui está o meu código modificado para obter o resultado.
Processo outputdatareceived waitforexit
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
Aqui está a minha função de lançamento:
Estou violando o modelo de Threading Powershell? Obrigado!
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Todas as respostas.
Eu acredito que você tenha alguns erros de digitação em seu código. Eu sou a pessoa mais humilde que você já conheceu.
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Na verdade, a menos que você queira criar um evento delegado. Mas, então, isso é o PowerShell, não é o VB.
Você pode começar aqui e ver se o evento que você está procurando pode ser "conectado"
Ajude Register-ObjectEvent - full.
Editado por jrv terça-feira, 27 de setembro de 2011 15:22.
A resposta marcada não resolve o problema com o qual o OP está lutando - isto é, redirecionando StdErr e StdOut e sofre com o bug de conflito discutido aqui:
Uma condição de impasse pode resultar se o processo pai chamar p. WaitForExit antes de p. StandardOutput. ReadToEnd e o processo filho grava texto suficiente para preencher o fluxo redirecionado. O processo pai esperaria indefinidamente para que o processo filho saísse. O processo infantil esperaria indefinidamente para o pai ler do fluxo de StandardOutput completo. & Quot;
Eu também estou tentando a melhor resposta para fazer isso funcionar no Powershell, mas todos os exemplos de código que estou executando, que utilizam System. Diagnostics. Process em powersehll são replicando o impasse nesta implementação ou não estão redirecionando stderr e stdout.
A solução em que estou indo usa o cmdlet Start-Process da seguinte maneira:
Não é uma ótima solução, pois só redirecionará stdout e stderr para um arquivo de texto. mas funcionará o tempo todo e redirecionará stdout e stderr.
Se nós vamos usar a saída redirecionada, não usaremos a espera. Esse foi o design do CreateProcess desde NT4.
O uso de arquivos para capturar a saída funcionará porque um fluxo é anexado que publica uma leitura constante para o fluxo de saída. O fluxo de saída nunca é suspenso. Yu não pode fazer isso em um loop de código. O fluxo corre o sistema do sistema do pecado Eu acredito e sempre terei uma chance de ler. A espera está no seu segmento para que você não consiga ler manualmente. É um impasse como afirmado.
O uso da leitura do console é geralmente porque estamos à procura de um prompt. Nesse caso, nunca esperamos a conclusão. O código ZTHe provavelmente será enviado para 'quit' e nós iremos verificar o processo e girá-lo até que ele seja desligado.
A questão aqui é que não podemos gerar um Thead. Em VB ou C #, C, usaríamos apenas threads de separação para IO e um para espera. Melhor ainda, eu usaria um semáforo, pois pode dinamicamente capturar um desligamento inesperado.
Talvez a próxima versão do PowerSHell tenha boas possibilidades de multithreading.
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Certo. O PowerShell é propositadamente limitado para torná-lo mais seguro para a população em geral e para reduzir os problemas que ocorrem com as linguagens compiladas.
Sim - o sinalizador de espera ajudaria, pois o arquivo pode não ter terminado o spool antes do programa encerrar.
Start-Process é um wrapper fraco na API do processo, mas protege os desavisados dos deadlocks porque você não pode redirecionar a entrada, exceto de um arquivo.
Você não precisa - venha para redirecionar. Você precisa de aguardar os arquivos e como uma maneira fácil de detecção de terminação. Usando a API, isso tem que ser feito consultando o objeto de processo ou extraindo a saída e aguardando que o processo envie sua mensagem de término e então gire o status.
Isso é muito demais para os scripts de administração e, como você apontou, não os levará a nenhum problema.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Desculpe, mas este tópico foi fechado por 5 anos. Você precisa iniciar seu próprio tópico.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Oi, você encontrou a solução? Eu tenho o mesmo problema :(
A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.
Process outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
O processo assíncrono é iniciado e aguarde que ele termine.
Eu sou novo no modelo de thread em. O que você usaria para:
iniciar um processo que lida com um arquivo (process. StartInfo. FileName = fileName;) aguarde até que o usuário feche o processo ou abandone o segmento depois de algum tempo se o usuário fechou o processo, exclua o arquivo.
Iniciando o processo e aguardando deve ser feito em um segmento diferente que o segmento principal, porque esta operação não deve afetar o aplicativo.
O meu aplicativo produz um relatório html. O usuário pode clicar com o botão direito do mouse em algum lugar e dizer "Exibir Relatório" - agora recupero o conteúdo do relatório em um arquivo temporário e inicio o processo que lida com arquivos html, ou seja, o navegador padrão. O problema é que não consigo limpar, ou seja, eliminar o arquivo temporário.
"e espera deve ser assíncrono" - eu não estou tentando ser engraçado, mas isso não é uma contradição em termos? No entanto, como você está iniciando um processo, o evento Exit pode ajudar:
Se você quiser realmente esperar (tempo limite, etc.), então:
Para esperar assíncrono, talvez apenas use um tópico diferente?
Adicionando uma alternativa avançada a esta velha pergunta. Se você quiser esperar que um processo seja encerrado sem bloquear nenhum segmento e ainda suportar tempos limite, tente o seguinte:
Novamente, a vantagem dessa abordagem em comparação com a resposta aceita é que você não está bloqueando nenhum encadeamento, o que reduz a sobrecarga do seu aplicativo.
Experimente o seguinte código.
Provavelmente não usaria um processo separado para abrir um arquivo. Em vez disso, provavelmente utilizaria um thread de segundo plano (se eu pensasse que a operação levaria muito tempo e possivelmente bloquearia o thread da interface do usuário).
Claro, este não é um bom exemplo de trabalho (não retorna nada) e não mostrei como a UI é atualizada (você precisa usar BeginInvoke no nível de UI porque um thread de fundo não pode atualizar o segmento de UI). Mas essa abordagem geralmente é como eu administrai operações assíncronas.
Você pode usar o evento Exited na classe Process.
e nesse caso você pode lidar com as operações que você mencionou.
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
Aqui está a minha função de lançamento:
Estou violando o modelo de Threading Powershell? Obrigado!
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Todas as respostas.
Eu acredito que você tenha alguns erros de digitação em seu código. Eu sou a pessoa mais humilde que você já conheceu.
Estou tentando iniciar um processo e pegar o StandardOutput e o StandardError usando EventHandlers e BeginOutputReadLine. Posso iniciar o processo, mas eu consigo.
Chamada de exceção "BeginOutputReadLine & quot; com "0" argumento (s): "Não é possível misturar a operação síncrona e assíncrona no fluxo de processo. & quot;
A mensagem de erro está informando o que você está fazendo de errado.
Você não pode atribuir funções a um processo síncrono. As funções não são delegados, então não funcionará. Você precisa usar um modelo de evento ou usar a variação do asynch.
Use isso como um modelo:
Marcado como resposta por Oliver Lipkau Moderador quarta-feira, 12 de outubro de 2011 2:32.
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Ok, eu não entendi a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.
Em VB, eu sei como 1) gerar threads para lidar com isso e eu sei que você pode colocar o processo em um loop 2) até que seja concluído como uma maneira de lidar com isso.
Eu não quero fazer # 2. Existe uma maneira multithreaded ou assíncrona para ler a saída de um determinado processo como o processo está gerando?
Na verdade, a menos que você queira criar um evento delegado. Mas, então, isso é o PowerShell, não é o VB.
Você pode começar aqui e ver se o evento que você está procurando pode ser "conectado"
Ajude Register-ObjectEvent - full.
Editado por jrv terça-feira, 27 de setembro de 2011 15:22.
A resposta marcada não resolve o problema com o qual o OP está lutando - isto é, redirecionando StdErr e StdOut e sofre com o bug de conflito discutido aqui:
Uma condição de impasse pode resultar se o processo pai chamar p. WaitForExit antes de p. StandardOutput. ReadToEnd e o processo filho grava texto suficiente para preencher o fluxo redirecionado. O processo pai esperaria indefinidamente para que o processo filho saísse. O processo infantil esperaria indefinidamente para o pai ler do fluxo de StandardOutput completo. & Quot;
Eu também estou tentando a melhor resposta para fazer isso funcionar no Powershell, mas todos os exemplos de código que estou executando, que utilizam System. Diagnostics. Process em powersehll são replicando o impasse nesta implementação ou não estão redirecionando stderr e stdout.
A solução em que estou indo usa o cmdlet Start-Process da seguinte maneira:
Não é uma ótima solução, pois só redirecionará stdout e stderr para um arquivo de texto. mas funcionará o tempo todo e redirecionará stdout e stderr.
Se nós vamos usar a saída redirecionada, não usaremos a espera. Esse foi o design do CreateProcess desde NT4.
O uso de arquivos para capturar a saída funcionará porque um fluxo é anexado que publica uma leitura constante para o fluxo de saída. O fluxo de saída nunca é suspenso. Yu não pode fazer isso em um loop de código. O fluxo corre o sistema do sistema do pecado Eu acredito e sempre terei uma chance de ler. A espera está no seu segmento para que você não consiga ler manualmente. É um impasse como afirmado.
O uso da leitura do console é geralmente porque estamos à procura de um prompt. Nesse caso, nunca esperamos a conclusão. O código ZTHe provavelmente será enviado para 'quit' e nós iremos verificar o processo e girá-lo até que ele seja desligado.
A questão aqui é que não podemos gerar um Thead. Em VB ou C #, C, usaríamos apenas threads de separação para IO e um para espera. Melhor ainda, eu usaria um semáforo, pois pode dinamicamente capturar um desligamento inesperado.
Talvez a próxima versão do PowerSHell tenha boas possibilidades de multithreading.
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Esta é apenas mais uma lição de que a Powershell é uma linguagem de script, não uma linguagem de programação, e tão poderosa quanto é, existem armadilhas.
O código de exemplo da Microsoft simplesmente não é abrangente o suficiente para um hack de powershell perceber que não podem chegar lá a partir daqui. Foi o que me atrapalhou e também acredito no OP, porque havia alguma expectativa de que BeginOutputReadline implementasse a magia para que ele funcionasse threads que resolveriam o problema de bloqueio. Não, então acabamos aqui.
E uma pequena correção para o meu código - deixei o sinalizador - que é necessário para o resto do código funcionar:
Certo. O PowerShell é propositadamente limitado para torná-lo mais seguro para a população em geral e para reduzir os problemas que ocorrem com as linguagens compiladas.
Sim - o sinalizador de espera ajudaria, pois o arquivo pode não ter terminado o spool antes do programa encerrar.
Start-Process é um wrapper fraco na API do processo, mas protege os desavisados dos deadlocks porque você não pode redirecionar a entrada, exceto de um arquivo.
Você não precisa - venha para redirecionar. Você precisa de aguardar os arquivos e como uma maneira fácil de detecção de terminação. Usando a API, isso tem que ser feito consultando o objeto de processo ou extraindo a saída e aguardando que o processo envie sua mensagem de término e então gire o status.
Isso é muito demais para os scripts de administração e, como você apontou, não os levará a nenhum problema.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Desculpe, mas este tópico foi fechado por 5 anos. Você precisa iniciar seu próprio tópico.
Olá, tenho feito muita leitura e tropeçando com esse tópico, percebi que tenho um problema semelhante. Estou tendo dificuldade em obter meus feeds de saída e meus erros para ler na janela do meu console ISE. Mesmo depois de ler tudo o que foi escrito acima e olhar para o local de ajuda do MSDN, ainda não consigo ver o erro em meus caminhos. Eu entendo que você não pode ler de forma assíncrona e síncrona ao mesmo tempo e que, se você chamar um antes do outro, eles ficarão impassíveis, mas ainda não consigo ver onde meu erro é porque eu não obtenho nenhum resultado. Meu código está abaixo. Se algum de vocês sabe de grandes recursos na aprendizagem do PowerShell, por favor me avise, eu poderia usar para aprender um pouco mais.
Apenas um estudante de tecnologia, é tudo!
Oi, você encontrou a solução? Eu tenho o mesmo problema :(
A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.
Comments
Post a Comment