Sunday 3 September 2017

C # standardoutput waitforexit


System. Diagnostics. ProcessStartInfoClass Assembly: System. dll Namespace: System. Diagnostics Summary Especifica um conjunto de valores usados ​​ao iniciar um processo. C Sintaxe: classe fechada pública ProcessStartInfo Comentários ProcessStartInfo é usado em conjunto com o componente Processo. Quando você inicia um processo usando a classe Process, você tem acesso para processar informações além da disponível quando anexado a um processo em execução. Você pode usar a classe ProcessStartInfo para obter maior controle sobre o processo que você inicia. Você deve, pelo menos, definir a propriedade ProcessStartInfo. FileName, manualmente ou usando o construtor. O nome do arquivo é qualquer aplicativo ou documento. Aqui, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico. Além disso, você pode definir outras propriedades que definam ações a serem realizadas com esse arquivo. Você pode especificar um valor específico para o tipo de propriedade ProcessStartInfo. FileName para a propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte CLI compartilhada). Por exemplo, você pode especificar imprimir para um tipo de documento. Além disso, você pode especificar os valores da propriedade ProcessStartInfo. Arguments para serem argumentos da linha de comando para passar ao procedimento aberto dos arquivos. Por exemplo, se você especificar um aplicativo de editor de texto na propriedade ProcessStartInfo. FileName, você pode usar a propriedade ProcessStartInfo. Arguments para especificar um arquivo de texto a ser aberto pelo editor. A entrada padrão geralmente é o teclado, e a saída padrão e o erro geralmente são a tela do monitor. No entanto, você pode usar o ProcessStartInfo. RedirectStandardInput. ProcessStartInfo. RedirectStandardOutput e ProcessStartInfo. RedirectStandardError propriedades para causar o processo para obter entrada ou retornar a saída para um arquivo ou outro dispositivo. Se você usar o Process. StandardInput. Process. StandardOutput. Ou Process. StandardError propriedades no componente processo, você deve primeiro definir o valor correspondente na propriedade ProcessStartInfo. Caso contrário, o sistema lança uma exceção quando você lê ou escreve no fluxo. Defina ProcessStartInfo. UseShellExecute para especificar se deseja iniciar o processo usando o shell do sistema operacional. Você pode alterar o valor de qualquer propriedade ProcessStartInfo até o momento em que o processo for iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito. System. Diagnostics. ProcessStartInfo Lista de Membros: Construtor padrão. Esse construtor é chamado por construtores de classes derivadas para inicializar o estado desse tipo. Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo. Sobrecarregado:.ctor (string fileName) Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo, como um aplicativo ou documento com o qual iniciar o processo. Sobrecarregado:.ctor (string fileName, argumentos de cadeia) Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo de aplicativo com o qual iniciar o processo, bem como um conjunto de argumentos de linha de comando para passar para o aplicativo. Gest ou define o conjunto de argumentos de linha de comando para usar ao iniciar o aplicativo. Obtém caminhos de pesquisa para arquivos, diretórios para arquivos temporários, opções específicas do aplicativo e outras informações similares. System. Diagnostics. ProcessStartInfo Detalhes do Membro Sobrecargado ctor 1 Resumo Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo. Construtor padrão. Esse construtor é chamado por construtores de classes derivadas para inicializar o estado desse tipo. Sintaxe C: Comentários Você deve definir pelo menos a propriedade ProcessStartInfo. FileName antes de iniciar o processo. O nome do arquivo é qualquer aplicativo ou documento. Nesse caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico. Opcionalmente, você também pode definir outras propriedades antes de iniciar o processo. A propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte CLI de origem compartilhada) fornece ações a serem realizadas, como imprimir, com o arquivo indicado na propriedade ProcessStartInfo. FileName. A propriedade ProcessStartInfo. Arguments fornece uma maneira de passar os argumentos da linha de comando para o arquivo quando o sistema o abrir. Sobrecarregado ctor 2 Resumo Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo, como um aplicativo ou documento com o qual iniciar o processo. Sintaxe C: um aplicativo ou documento com o qual iniciar um processo. Comentários O nome do arquivo é qualquer aplicativo ou documento. Nesse caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado conduz a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico. Você pode alterar a propriedade ProcessStartInfo. FileName depois de chamar esse construtor, até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito. Sobrecargado ctor 3 Resumo Inicializa uma nova instância da classe ProcessStartInfo e especifica um nome de arquivo de aplicativo com o qual iniciar o processo, bem como um conjunto de argumentos de linha de comando para passar para o aplicativo. Sintaxe C: um aplicativo com o qual iniciar um processo. Argumentos da linha de comando para passar para o aplicativo quando o processo for iniciado. Comentários O nome do arquivo é qualquer aplicativo ou documento. Nesse caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico. Você pode alterar as propriedades ProcessStartInfo. FileName ou ProcessStartInfo. Arguments depois de chamar este construtor, até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito. Propriedade: Argumentos (leitura-escrita) Resumo Gest ou define o conjunto de argumentos de linha de comando para usar ao iniciar o aplicativo. Sintaxe C: Propriedade: EnvironmentVariables (somente leitura) Resumo Obtém os caminhos de pesquisa para arquivos, diretórios para arquivos temporários, opções específicas de aplicativos e outras informações semelhantes. C Sintaxe: Propriedade: RedirectStandardError (leitura-escrita) Resumo Obtém ou define um valor indicando se a saída de erro dos processos está gravada nas instâncias do processo Process. StandardError, permitindo que você escreva para um destino diferente do fluxo de erro padrão (geralmente o tela do monitor). Usado para escrever dados de erro em um arquivo ou um registro, por exemplo. Sintaxe C: Comentários O componente Processo se comunica com um processo filho através de um pipe. Se um processo filho escrever dados suficientes para o tubo para preencher o buffer, a criança irá bloquear até que o pai lê os dados do tubo. Isso pode causar bloqueio se seu aplicativo estiver lendo toda a saída para erro padrão e saída padrão, por exemplo, usando o seguinte código C. Nessa instância, ambos os processos pai e filho seriam bloqueados, pois o tubo preenchido impede que o processo filho seja concluído, enquanto o processo pai está aguardando indefinidamente para que o processo filho saia. Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (). do seguinte modo. Um problema semelhante surge 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. Neste 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. Propriedade: RedirectStandardInput (leitura-escrita) Resumo Obtém ou define um valor que indica se a entrada do comando do processo é lida das instâncias do Process Process. StandardInput, permitindo que você leia uma fonte diferente do fluxo de entrada padrão (geralmente o teclado). Usado para ler dados de um arquivo, por exemplo. C Sintaxe: Propriedade: RedirectStandardOutput (leitura-escrita) Resumo Obtém ou define um valor indicando se a saída do processo está gravada nas instâncias do processo Process. StandardOutput, permitindo que você escreva para um destino diferente do fluxo de saída padrão (geralmente o monitor tela). Usado para escrever dados em um arquivo, por exemplo. Sintaxe C: Comentários O componente Processo se comunica com um processo filho através de um pipe. Se um processo filho escrever dados suficientes para o tubo para preencher o buffer, a criança irá bloquear até que o pai lê os dados do tubo. Isso pode causar bloqueio se seu aplicativo estiver lendo toda a saída para erro padrão e saída padrão, por exemplo, usando o seguinte código C. Nessa instância, ambos os processos pai e filho seriam bloqueados, pois o tubo preenchido impede que o processo filho seja concluído, enquanto o processo pai está aguardando indefinidamente para que o processo filho saia. Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (). do seguinte modo. Um problema semelhante surge 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. Neste 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. Propriedade: UseShellExecute (leitura-escrita) Resumo Obtém ou define um valor indicando se deseja usar o shell do sistema operacional para iniciar o processo. C Sintaxe: Comentários Definir esta propriedade como falso permite redirecionar os fluxos de entrada, saída e erro. Quando você usa o shell do sistema operacional para iniciar processos, você pode iniciar qualquer documento (que é qualquer tipo de arquivo registrado associado a um executável que tenha uma ação aberta padrão) e executar operações no arquivo, como impressão, com o Processo componente. Quando ProcessStartInfo. UseShellExecute é falso. Você pode iniciar apenas executáveis ​​com o componente Processo. Propriedade: WorkingDirectory (leitura-escrita) Resumo Obtém ou define o diretório inicial para o processo a ser iniciado. Sintaxe C: Comentários Se o diretório já faz parte da variável do caminho do sistema, não é necessário repetir a localização do diretor em esta propriedade. Elina: obrigado pela sua resposta. Existem algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a essa questão. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução mais moderna, Tarefa paralela (TPL), baseada em solução para 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar também o seu código ou talvez algo equivalente ao quotggsci. exequot do quot quotgbsci. exequot se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 em 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet 7 de novembro 14 às 18:38 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 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. Respondeu 13 de janeiro 15 às 10:35 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 bug relacionado à leitura de fluxo de saída de processo assíncrono. 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 você 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 obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process 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. Elina: obrigado pela sua resposta. Existem algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a essa questão. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução mais moderna, Tarefa paralela (TPL), baseada em solução para 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar também o seu código ou talvez algo equivalente ao quotggsci. exequot do quot quotgbsci. exequot se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 em 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet 7 de novembro 14 às 18:38 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 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. Respondeu 13 de janeiro 15 às 10:35 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 bug relacionado à leitura de fluxo de saída de processo assíncrono. 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 você 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 obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process 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. System. Diagnostics. Process: redirecionar StandardInput, StandardOutput, StandardError 82218217 InputAndOutputToEnd: uma maneira útil de usar o inputoutputerror redirecionado em uma p. 82218217 ltparam name8221p8221gtThe p para redirecionar. Deve ter UseShellExecute definido como false. ltparamgt 82218217 ltparam name8221StandardInput8221gtEsta seqüência será enviada como entrada para a p. (Deve ser Nothing if not StartInfo. RedirectStandardInput) ltparamgt 82218217 ltparam name8221StandardOutput8221gt A saída p8217s será coletada nesta string ByRef. (Deve ser Nothing if not StartInfo. RedirectStandardOutput) ltparamgt 82218217 ltparam name8221StandardError8221gtO erro p8217s será coletado nesta string ByRef. (Deve ser Nothing if not StartInfo. RedirectStandardError) ltparamgt 82218217 ltremarksgtEsta função resolve o problema do deadlock mencionado em msdn. microsoften-uslibrarysystem. diagnostics. p.standardoutput. aspxltremarksgt ltRuntimepilerServices. Extension () gt Sub InputAndOutputToEnd (ByVal p As Diagnostics. Process, ByVal StandardInput As String. ByRef StandardOutput As String. ByRef StandardError As String) Se p is Nothing, então, lance New ArgumentException (8220p deve ser não-null8221) 8216 Suponha que p tenha começado. Infelizmente não há como verificar. Se p. StartInfo. UseShellExecute, então, lança New ArgumentException (8220Set StartInfo. UseShellExecute to false8221) Se (p. StartInfo. RedirectStandardInput ltgt (StandardInput IsNot Nothing)), então, lança New ArgumentException (8220Provide uma entrada não-nula somente quando StartInfo. RedirectStandardInput8221) If (P. StartInfo. RedirectStandardOutput ltgt (StandardOutput IsNot Nothing)) Então, lança New ArgumentException (8220Provide uma saída não nula somente quando StartInfo. RedirectStandardOutput8221) Se (p. StartInfo. RedirectStandardError ltgt (StandardError IsNot Nothing)), então, lança New ArgumentException (8220Provide Um erro não nulo apenas quando StartInfo. RedirectStandardError8221) Dim outputData como novo InputAndOutputToEndData Dim errorData como novo InputAndOutputToEndData Se p. StartInfo. RedirectStandardOutput Then

No comments:

Post a Comment