Wednesday 16 August 2017

Msiexec Waitforexit Doesnt Wait


Eu tenho uma situação onde eu quero executar um arquivo e, em seguida, excluir o arquivo executável quando a execução é feita. Eu uso System. Diagnostics. Process. Start () para executar o arquivo, e usar. WaitForExit () para aguardar o processo para concluir. Em seguida, uso File. Delete (filename) para excluir o arquivo executável. O problema é que, às vezes, File. Delete irá falhar com o seguinte erro: Isso me leva a acreditar que, de alguma forma, o processo ainda está vivo e bloquear o arquivo executável mesmo após a chamada. WaitForExit () retorna. Eu encontrei outros threads na rede que descrevem o mesmo comportamento, mas eu não encontrei qualquer que concluir com uma razoável explicação ou solução para o problema, além de sugestões de colocar um Sleep (n) após WaitForExit (). Exemplos: Aqui está um programa de exemplo que reproduz o problema para mim. Eu testei no Windows XP e no Windows 7, e ambos eventualmente falham em algum ponto com o mesmo erro. Observe também que o executável ss. exe é um simples aplicativo de console quotHello Worldquot simples. E a saída normalmente parece algo como (com quantidade variável de iterações antes do acidente ocorre): Qualquer idéia sobre por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código) Sexta-feira, 08 de janeiro de 2010 3 : 40 PM A razão é que, embora o processo seja concluído, pode demorar alguns milissegundos para o sistema operacional terminar de destruí-lo. É um sistema operacional multi-tarefa, afinal, está tentando atender a todos ao mesmo tempo. Infelizmente, não há maneira de saber quando o arquivo não está mais bloqueado (presicely). Quando você WaitForExit, você está criando um objeto de bloqueio no objeto de processo. O objeto de processo não pode ser destruído até que o bloqueio é liberado e você não pode esperar em algo que não existe (tipo de frango e ovo de questão). Então, a única coisa razoável que você pode fazer é continuar tentando, algo como: Marcado como resposta por Samuel Stanojevic Sexta-feira, 08 de janeiro de 2010 16:20 Editado por Tergiver sexta-feira, 08 de janeiro de 2010 16:20 mudou para bool, loop infinito Correcção Sexta-feira, 08 de Janeiro de 2010 16:15 Microsoft está a realizar uma pesquisa online para compreender a sua opinião sobre o site Msdn. Se você optar por participar, a pesquisa on-line será apresentada a você quando você deixar o site Msdn. Você gostaria de participarAdicionar comando de saída na sua lista de comandos: System. Diagnostics. ProcessStartInfo si new System. Diagnostics. ProcessStartInfo (quotcmd. exequot) si. RedirectStandardInput true si. RedirectStandardOutput true si. RedirectStandardError true si. UseShellExecute false si. CreateNoWindow true si. WindowStyle System. Diagnostics. ProcessWindowStyle. Hidden System. Diagnostics. Process console System. Diagnostics. Process. Start (si) console. StandardInput. WriteLine (quotsome commandsquot) console. StandardInput. WriteLine (quotEXITquot) Por favor, marque a postagem como resposta se ele É útil para você porque aumenta os membros a responder mais e mais. Sugerido como resposta por SuDhiR segunda-feira, 7 de setembro de 2009 10:26 Marcado como resposta por YiChun Chen segunda-feira, 14 de setembro de 2009 2:29 segunda-feira, 7 de setembro de 2009 8:59 Todas as respostas Talvez o aplicativo não seja visível Mais tempo, mas ainda em execução. É o valor de retorno do console. WaitForExit () verdadeiro ou falso Geert van Horrik - CatenaLogic Visite meu blog: blog. catenalogic Procurando uma maneira de implantar suas atualizações para todos os seus clientes Tente Updater segunda-feira, 7 de setembro de 2009 8:58 Adicionar comando de saída na lista de comandos: System. Diagnostics. ProcessStartInfo si new System. Diagnostics. ProcessStartInfo (quotcmd. exequot) si. RedirectStandardInput true si. RedirectStandardOutput true si. RedirectStandardError true si. UseShellExecute false si. CreateNoWindow true si. WindowStyle System. Diagnostics. ProcessWindowStyle. Hidden System. Diagnostics. Process console System. Diagnostics. Process. Start (si) console. StandardInput. WriteLine (quotsome commandsquot) console. StandardInput. WriteLine (quotEXITquot) Por favor, marque a postagem como resposta se for útil para você Porque ele estimula os membros a responder cada vez mais. Proposta como resposta por SuDhiR segunda-feira, 7 de setembro de 2009 10:26 Marcada como resposta por YiChun Chen Segunda-feira, 14 de setembro de 2009 2:29 Segunda-feira, 07 de setembro de 2009 8:59 Quando você cria uma instância do cmd. Exe, ele inicia o processador de comandos. Redirecionar a entrada padrão e enviar um comando para o processo fará com que cmd. exe (processador de comandos) execute o comando eo comando será encerrado, mas o processador de comandos continuará em execução aguardando o próximo comando (isso é semelhante ao que acontece quando um usuário inicia O console de comando digitando cmd. exe no prompt de execução do Windows). Para fazer o console de comando sair, você tem que enviar o comando de saída especificamente para o processador de comando (como sugerido por SuDhiR) ou fazer o seu comando um arquivo em lotes e executar o arquivo em lotes em vez de cmd. exe. Segunda-feira, 7 de setembro de 2009 9: 17 Adicionar / c para os argumentos de linha de comando para cmd. exe automaticamente sai após executar os comandos. Hans Passant. Marcado como resposta por YiChun Chen Monday, September 14, 2009 2:28 AM Monday, September 07, 2009 9:30 AM 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 a você quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite a nossa página UserVoice para enviar e votar em ideias Centros de desenvolvimento Recursos de aprendizagem Community Support ProgramsLançamento do MSIExec. exe A partir do CI surgiu um problema ao tentar gerar um processo para iniciar um comando MSIExec. exe a partir do C.160 Eu queria iniciar o processo E depois esperar por ele para terminar antes de prosseguir no entanto, 160 sempre foi retornado imediatamente antes da instalação ou desinstalação foi realmente finished.160 Eu confirmei este comportamento com esta entrada de blog: 160 blogs. msdn / heaths / archive / 2005/11/15 /493236.aspx O autor sugere quot start / wait quot que funciona a partir da linha de comando ou um arquivo em lote.160 Eu verifiquei que ele funciona lançando um arquivo em lote ou dois de C, mas eu preferi manter em C tanto quanto possível. 160 Além disso, eu estava tentando realizar um processo em segundo plano silencioso executando os comandos MSIExec.160 No entanto, C can8217t apenas iniciar um processo chamado quot start, quot que é um comando interno para o prompt de comando eu acho. Alguém me lembrou em uma placa de mensagem que você pode iniciar um processo usando CMD. exe. Chamar quot iniciar quot como este: Ele funciona como um charme.160 Eu don8217t acho que você ainda precisa da bandeira quot / MIN quot para quot iniciar quot de qualquer maneira. Comentários Obrigado por isso. Boa ideia. Trabalhou para mim. Você poderia usar process. WaitForExit () isn39t ele cópia de direitos autorais 2012 Mike Murray Crédito do projeto: Shashank Mehta código por favor responsàvel

No comments:

Post a Comment