вторник, 26 июня 2018 г.

Processo de espera até agora redirecional


Processo espera por vez anterior redirectstandardoutput
Obter através da App Store Leia esta publicação em nosso aplicativo!
Saída do processo de redirecionamento C #
Gostaria de redirecionar a saída padrão do Processo para uma string para análise posterior. Gostaria também de ver a saída na tela, enquanto o processo está em execução, e não apenas quando ela termina.
É mesmo possível?
Exemplo de MSDN:
Veja também OutputDataReceived e BeginOutputReadLine () para uma alternativa para ReadToEnd (), que melhorará o seu requisito de "ver saída enquanto o processo estiver em execução".
Se você deseja executar um exe do seu aplicativo c # e obter o resultado dele, então você pode usar o código abaixo.

Processo espera por vez anterior redirectstandardoutput
Eu uso System. Diagnostics. Process. Start () para executar o arquivo e use. WaitForExit () para aguardar a conclusão do processo.
Eu então uso File. Delete (filename) para excluir o arquivo executável.
Isso me leva a acreditar que, de alguma forma, o processo ainda está vivo e bloqueando o arquivo executável mesmo depois que a chamada. WaitForExit () retorna.
Qualquer idéia de por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código)?
Marcado como resposta por Samuel Stanojevic sexta-feira, 08 de janeiro de 2010 4:20 PM Editado por Tergiver sexta-feira, 8 de janeiro de 2010 4:20 PM mudou para bool, arranjo de loop infinito.
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ê sair do site do Msdn.

Processo espera por vez anterior redirectstandardoutput
Obter através da App Store Leia esta publicação em nosso aplicativo!
Capturando o padrão e o erro com o Start-Process.
Existe um erro no comando Start-Process do Powershell ao acessar as propriedades StandardError e StandardOutput?
Se eu executar o seguinte, não recebo saída.
Mas se eu redirecionar a saída para um arquivo, recebo o resultado esperado.
Foi assim que o Start-Process foi projetado por algum motivo. Aqui está uma maneira de obtê-lo sem enviar ao arquivo:
no código dado na pergunta, acho que a leitura da propriedade ExitCode da variável de iniciação deve funcionar.
Observe que (como no seu exemplo) você precisa adicionar os parâmetros "PassThru e - guardar" (isso me surpreendeu por um tempo)
Eu também tive esse problema e acabei usando o código Andys para criar uma função para limpar as coisas quando vários comandos precisam ser executados, ele retornará os códigos stderr, stdout e exit como objetos. Uma coisa a notar que a função não aceita. \ No caminho, os caminhos completos devem ser usados.
aqui é como usá-lo.
Eu realmente tive problemas com os exemplos acima de Andy Arismendi e LPG. Você sempre deve usar:
O exemplo completo é:
Nós usamos a função conforme previsto acima pelo GLP. No entanto, isso contém um erro que você pode encontrar quando você inicia um processo que gera muito resultado. Devido a isso, você pode acabar com um impasse ao usar esta função. Em vez disso use a versão adaptada abaixo:
Mais informações sobre este problema podem ser encontradas no MSDN:
Uma condição de impasse pode resultar se o processo pai chama p. WaitForExit antes de p. StandardError. 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 filho esperaria indefinidamente para o pai ler do fluxo completo do StandardError.
EDITAR: adicionou uma braçadeira curvada faltante no final do bloco Try.

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.

Processo espera por vez anterior redirectstandardoutput
Eu procurei tópicos diferentes sobre isso, mas todos usam o Process. RedirectStandardOutput = True, o que eu não.
Estou tentando abrir um processo (aplicativo de console, não feito por mim) para compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar.
Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está o meu código:
Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C #. E seu código está funcionando perfeitamente.
Espero que seu dia tenha sido melhor do que ontem, mas que seja pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 3 de janeiro de 2015 14:57.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Todas as respostas.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Editado por Viorel_ MVP sábado, 03 de janeiro de 2015 4:27 PM.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Isso realmente aconteceu. Eu tinha esquecido que os espaços em branco tornam um novo argumento, meu bobo. Não uso argumentos de processo que muitas vezes. ;)
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Fazê-lo da maneira normal (arrastar e soltar, ou fazê-lo via CMD) funciona, sim.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz sábado, 3 de janeiro de 2015 16:39.
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ê sair do site do Msdn.

Propriedade ProcessStartInfo. RedirectStandardError.
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Obtém ou define um valor que indica se a saída de erro de um aplicativo está gravada no fluxo Process. StandardError.
Assembly: System (no System. dll)
Valor da propriedade.
Quando um Processo grava texto em seu fluxo de erros padrão, esse texto normalmente é exibido no console. Ao redirecionar o fluxo StandardError, você pode manipular ou suprimir a saída de erro de um processo. Por exemplo, você pode filtrar o texto, formatá-lo de maneira diferente ou gravar a saída no console e em um arquivo de log designado.
Você deve definir UseShellExecute como falso se desejar configurar o RedirectStandardError como verdadeiro. Caso contrário, a leitura do fluxo StandardError gerará uma exceção.
O fluxo StandardError redirecionado pode ser lido de forma síncrona ou assíncrona. Métodos como Read, ReadLine e ReadToEnd executam operações de leitura síncrona no fluxo de saída de erro do processo. Essas operações de leitura síncrona não são concluídas até que o Processo associado escreva em seu fluxo StandardError ou encerre o fluxo.
Em contraste, BeginErrorReadLine inicia operações de leitura assíncronas no fluxo StandardError. Este método habilita um manipulador de eventos designado para a saída do fluxo e retorna imediatamente ao chamador, o que pode executar outro trabalho enquanto a saída do fluxo é direcionada para o manipulador de eventos.
O aplicativo que está processando a saída assíncrona deve chamar o método WaitForExit para garantir que o buffer de saída tenha sido liberado.
As operações de leitura síncrona introduzem uma dependência entre a leitura do responsável pela chamada do fluxo StandardError e a gravação do processo filho nesse fluxo. Essas dependências podem causar condições de bloqueio. Quando o chamador lê o fluxo redirecionado de um processo filho, ele depende do filho. O chamador aguarda a operação de leitura até que a criança escreva no fluxo ou encerre o fluxo. Quando o processo filho grava dados suficientes para preencher o fluxo redirecionado, ele depende do pai. O processo filho aguarda a próxima operação de gravação até que o pai lê do fluxo completo ou fecha o fluxo. A condição de impasse ocorre quando o processo do chamador e filho aguardam um ao outro para completar uma operação, e nenhuma delas pode continuar. Você pode evitar deadlocks avaliando dependências entre o chamador e o processo filho.
Por exemplo, o seguinte código C # mostra como ler de um fluxo redirecionado e aguarde até que o processo filho saia.
O exemplo de código evita uma condição de bloqueio chamando p. StandardError. ReadToEnd antes de p. WaitForExit. Uma condição de impasse pode resultar se o processo pai chama p. WaitForExit antes de p. StandardError. 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 filho esperaria indefinidamente para o pai ler do fluxo completo do StandardError.
Há um problema semelhante ao ler todo o texto da saída padrão e dos fluxos de erro padrão. Por exemplo, o seguinte código C # executa uma operação de leitura em ambos os fluxos.
O exemplo de código evita a condição de bloqueio executando operações de leitura assíncronas no fluxo StandardOutput. Um estado de impasse resulta se o processo pai chamar p. StandardOutput. ReadToEnd seguido de p. StandardError. ReadToEnd e o processo filho escreve texto suficiente para preencher o fluxo de erros. O processo pai aguardaria indefinidamente o processo filho para fechar o fluxo StandardOutput. O processo filho esperaria indefinidamente para o pai ler do fluxo completo do StandardError.
Você pode usar operações de leitura assíncronas para evitar essas dependências e seu potencial de impasse. Alternativamente, você pode evitar a condição de bloqueio criando dois tópicos e lendo a saída de cada fluxo em um segmento separado.
O exemplo a seguir usa o comando net use junto com um argumento fornecido pelo usuário para mapear um recurso de rede. Em seguida, ele lê o fluxo de erro padrão do comando net e o grava no console.

Комментариев нет:

Отправить комментарий