Oi, estou desenvolvendo um aplicativo de console C que inicia uma linha de comando e obtém alguns dados através de outro comando (o que é irrelevante nesta discussão). Eventualmente, vou obter alguns dados na linha de comando e eu só preciso apenas da última linha disso. Eu usei o seguinte código: Process. StartInfo. FileName quotcmd. exequot Process. StartInfo. RedirectStandardInput true Process. StartInfo. RedirectStandardOutput true Eu usei o Process. StandardInput. WriteLine para escrever os comandos que eu preciso para o console. Mas se Process. StartInfo. RedirectStandardOutput é verdade, não estou obtendo a saída desejada usando a instrução Process. StandardOutput. ReadToEnd (). Split (n) Enquanto a opção ReadLine está funcionando bem e eu estou recebendo a primeira linha do texto exibido. Como sempre que os dados que eu consigo no console diferem, não consigo codificar qualquer tipo de ação específica de onde obter minha saída. Mesmo que eu coloquei um relógio na declaração Process. StandardOutput. ReadToEnd (). Split (n) Estou recebendo uma exceção de tempo limite de função. Por favor me ajude com esse problema. Quinta-feira, 07 de agosto de 2008 5:44 AM Então copiei o código de Manjus. Myprocesss quotcmd. exequot. Primeiro, enviei o comando quotipconfigquot, com um readToEnd () Timed out. Tentou ler em blocos, falhou também. Tentou esperarForInputIddle (), mas esqueceu cmd sem interface gráfica, falhou também. Então eu precisava do cmd para terminar o fluxo se eu quisesse lê-lo. Ok então saia Então eu tentei enviar TODOS OS MEUS COMUNES, INCLUINDO primeiro o comando de saída, depois lendo. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funciona como um encanto. Meu ReadToEnd () retorna uma string em meio segundo, e eu obtive toda a informação que eu preciso. -) Isso poderia ser de alguma ajuda para você, Gauri O improvável que fazemos, o impossível demora um pouco mais. - Steven Parker Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:44 AM quinta-feira, 07 de agosto de 2008 7:51 AM ReadToEnd () é capaz de causar impasse, especialmente quando você o codifica após um WaitForExit () ou envia Muita entrada. O processo está escrevendo sua saída para um buffer, esse buffer não é muito grande (2KB, eu acho). Você não lê o conteúdo deste buffer, digamos com o ReadLine (), o processo irá parar, esperando que o buffer seja esvaziado. O seu programa, por sua vez, será interrompido, pois WaitForExit () nunca retornará ou a chamada WriteLine () será interrompida, já que o processo não está mais a ler a entrada. Se esse for seu cenário, você precisará ler de forma assíncrona com BeginOutputReadLine (). Hans Passant. Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:44 AM quinta-feira, 07 de agosto de 2008 12:13 PM Todas as respostas Você também precisa definir Process. StartInfo. UseShellExecute como falso. Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:43 AM O que há acima é uma resposta padrão muito agradável, no entanto. Eu não acho que o quotcmdquot termina o fluxo. Não há nada enviado a partir do cmd-box para indicar que o fluxo está encerrado. Considere uma página da Web que você carrega, uma vez que o código html inteiro chegou ao seu PC, o fluxo está pronto. Mesmo com a leitura de um arquivo, uma vez que você alcançou o último personagem, o fluxo está pronto. No entanto, com cmd, o fluxo não é quotdonequot. Ele só espera uma nova entrada, então, se você der um outro comando, ele terá saída novamente. Hmm, eu pareço ter problemas para me expressar em inglês novamente, minhas desculpas. De qualquer forma, não penso que haja algo que você possa fazer para usar ReadToEnd () em um cmd-output-stream, a menos que você envie o comando quotexitquot. Você tentou combinar o readline () com um. Uma análise da linha (ou seja, você obtém linhas vazias) ou b. O comando Process. WaitForIddleInput () O improvável que fazemos, o impossível demora um pouco mais. - Steven Parker quinta-feira, 07 de agosto de 2008 7:35 AM Caso você esteja executando o processo cmd. Lembre-se de escrever quotEXITquot no fluxo de entrada Quinta-feira, 07 de agosto de 2008 7:51 AM Então copiei o código do Manjus. Myprocesss quotcmd. exequot. Primeiro, enviei o comando quotipconfigquot, com um readToEnd () Timed out. Tentou ler em blocos, falhou também. Tentou esperarForInputIddle (), mas esqueceu cmd sem interface gráfica, falhou também. Então eu precisava do cmd para terminar o fluxo se eu quisesse lê-lo. Ok então saia Então eu tentei enviar TODOS OS MEUS COMUNES, INCLUINDO primeiro o comando de saída, depois lendo. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funciona como um encanto. Meu ReadToEnd () retorna uma string em meio segundo, e eu obtive toda a informação que eu preciso. -) Isso poderia ser de alguma ajuda para você, Gauri O improvável que fazemos, o impossível demora um pouco mais. - Steven Parker Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:44 AM quinta-feira, 07 de agosto de 2008 7:51 AM ReadToEnd () é capaz de causar impasse, especialmente quando você o codifica após um WaitForExit () ou envia Muita entrada. O processo está escrevendo sua saída para um buffer, esse buffer não é muito grande (2KB, eu acho). Você não lê o conteúdo deste buffer, digamos com o ReadLine (), o processo irá parar, esperando que o buffer seja esvaziado. O seu programa, por sua vez, será interrompido, pois WaitForExit () nunca retornará ou a chamada WriteLine () será interrompida, já que o processo não está mais a ler a entrada. Se esse for seu cenário, você precisará ler de forma assíncrona com BeginOutputReadLine (). Hans Passant. Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:44 da manhã Quinta-feira, 07 de agosto de 2008 12:13 PM A Microsoft está realizando 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. Gostaria de participarSystem. Diagnostics. Process. StandardOutput Propriedade Obtém um fluxo usado para ler a saída do aplicativo. SystemponentModel. Browsable (falso) SystemponentModel. DesignerSerializationVisibility (SystemponentModel. DesignerSerializationVisibility. Hidden) System. Diagnostics. MonitoringDescription (O fluxo de saída padrão deste processo.) Public StreamReader StandardOutput Quando um processo grava texto em seu fluxo padrão, esse texto normalmente é exibido em O console. Redirecionando o fluxo Process. StandardOutput, você pode manipular ou suprimir a saída de um processo. Por exemplo, você pode filtrar o texto, formatá-lo de forma diferente ou escrever a saída para o console e um arquivo de log designado. O fluxo de Process. StandardOutput redirecionado pode ser lido de forma síncrona ou assíncrona. Métodos como StreamReader. Leia. StreamReader. ReadLine. E StreamReader. ReadToEnd executam operações de leitura síncrona no fluxo de saída do processo. Essas operações de leitura síncrona não são concluídas até que o Processo associado escreva em seu fluxo Process. StandardOutput ou encerre o fluxo. Em contraste, Process. BeginOutputReadLine inicia operações de leitura assíncronas no fluxo Process. StandardOutput. 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. As operações de leitura síncrona introduzem uma dependência entre a leitura do chamador do fluxo Process. StandardOutput e a escrita do processo filho para esse fluxo. Essas dependências podem resultar em condições de impasse. Quando o chamador lê do fluxo redirecionado de um processo filho, ele depende da criança. O chamador aguarda a operação de leitura até que a criança grava o 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 na próxima operação de gravação até que o pai lê do fluxo completo ou fecha o fluxo. A condição de deadlock resulta quando o processo do chamador e filho aguardam um para o outro para completar uma operação, e nenhuma delas pode prosseguir. Você pode evitar deadlocks avaliando as dependências entre o chamador e o processo filho. O código C a seguir, por exemplo, 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. StandardOutput. ReadToEnd antes de p. WaitForExit. 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 aguardaria indefinidamente o processo filho para sair. O processo infantil esperaria indefinidamente para que o pai leia o fluxo completo Process. StandardOutput. Há um problema semelhante quando você lê todo o texto tanto da saída padrão como dos fluxos de erro padrão. O seguinte código C, por exemplo, 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 Process. 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 Process. StandardOutput. O processo filho aguardaria indefinidamente para que o pai leia o fluxo completo Process. 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 threads e lendo a saída de cada fluxo em um segmento separado. Você não pode misturar operações de leitura assíncronas e síncronas em um fluxo redirecionado. Uma vez que o fluxo redirecionado de um Processo é aberto em modo assíncrono ou síncrono, todas as operações de leitura adicionais nesse fluxo devem estar no mesmo modo. Por exemplo, não siga Process. BeginOutputReadLine com uma chamada para StreamReader. ReadLine no fluxo Process. StandardOutput ou vice-versa. No entanto, você pode ler dois fluxos diferentes em diferentes modos. Por exemplo, você pode chamar Process. BeginOutputReadLine e, em seguida, chamar StreamReader. ReadLine para o fluxo Process. StandardError. Namespace de requisitos: System. Diagnostics Assembly: System (em System. dll) Versões de montagem: 1.0.5000.0, 2.0.0.0, 4.0.0.0
No comments:
Post a Comment