Saída padrão readtoend waitforexit


WinSCP Free SFTP, SCP e cliente FTP para Windows SFTP transferências de arquivos em Técnicas demonstradas por este artigo são implementadas para você no assembly WinSCP. O uso da montagem é uma abordagem recomendada sobre a implementação dessas técnicas por conta própria. Este guia descreve como implementar a transferência SFTP no aplicativo usando o WinSCP. WinSCP é cliente SFTP com interface de script que você pode usar para automatizar muitas operações que ele suporta, incluindo transferências de arquivos, sincronização e outros. Portanto, o WinSCP não é uma biblioteca (por exemplo, montagem) que você pode chamar diretamente. Embora este guia mostre como você pode usá-lo perfeitamente a partir do código. Antes de Iniciar Antes de começar, você deve: Usar o WinSCP do Código Executando o Processo do WinSCP Para executar o winscp use System. Diagnostics. Process. Esta classe permite executar qualquer executável, possivelmente redirecionando sua entrada e saída padrão para um fluxo acessível a partir do código. O código abaixo espera que o winscp (ProcessStartInfo. FileName) possa ser encontrado no diretório de trabalho atual ou no caminho de pesquisa. Você precisa fornecer o caminho completo do contrário. Alimentando comandos de script usando a entrada padrão Você pode usar o redirecionamento de entrada padrão (ProcessStartInfo. RedirectStandardInput) para alimentar comandos de script. Pouca necessidade de montar arquivo de script temporário.1) Para alimentar comandos para o uso padrão de entrada Process. StandardInput stream: Capturar saídas do processo WinSCP Enquanto você pode redirecionar a saída padrão do processo WinSCP, na verdade não é muito útil, pois o resultado do WinSCP não Tem qualquer forma pré-definida (não pode ser analisada). Embora possa ser útil para a captura, caso queira mostrar para um usuário em sua GUI ou para fins de diagnóstico. Se você quiser coletar a saída, redirecione a saída padrão antes de iniciar o WinSCP (ProcessStartInfo. RedirectStandardOutput) e leia do fluxo de saída (Process. StandardOutput). Você precisa coletar continuamente a saída enquanto o script está sendo executado. O fluxo de saída tem capacidade limitada. Uma vez que ele é preenchido, o WinSCP espera espera espaço livre, nunca terminando. Isso significa que você não pode usar Process. WaitForExit por conta própria para aguardar o encerramento do script. Alternativa conveniente é StreamReader. ReadToEnd. Usando o arquivo de log Para capturar resultados do script, você pode usar o registro XML. Para isso, você precisa instruir o WinSCP para armazenar o arquivo de log usando o parâmetro da linha de comando xmllog (ProcessStartInfo. Arguments). Note que, antes de começar com segurança, começar a ler e analisar o arquivo de log XML usando o analisador baseado em árvore (como XmlDocument ou XPathDocument), você precisa aguardar o encerramento do WinSCP. Veja o exemplo abaixo. Se você precisar ler o arquivo de log continuamente, você precisa usar o analisador baseado em fluxo (como o XmlReader). Consultar exemplo. O exemplo a seguir mostra como usar a análise baseada em árvore usando XPathDocument. Em caso de erro, você pode verificar elementos de mensagem para capturar quaisquer mensagens de erro associadas: Em caso de sucesso, você pode, por exemplo, Extrair listagem de diretório gerada pelo comando ls dentro do elemento ls: Esperando que o script seja concluído Use Process. WaitForExit para aguardar o processo do WinSCP para finalizar. Se você tiver o fluxo de saída redirecionado, você precisa primeiro ler o fluxo de saída para o final. Uma boa prática é fechar o fluxo de entrada também, se você o tiver redirecionado. Verificando o código de saída Quando o script do WinSCP terminar, verifique o código de saída (Process. ExitCode) do processo: 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.

Comments

Popular Posts