Msiexec Waitforexit Doesnt Wait


Eu tenho uma situação em que eu quero executar um arquivo e, em seguida, exclua o arquivo executável quando a execução estiver concluída. 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. O problema é que às vezes, File. Delete falhará com o seguinte erro: 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. Eu encontrei outros tópicos na rede que descrevem o mesmo comportamento, mas não encontrei nenhum que conclua com uma explicação ou solução razoável para o problema, além das sugestões de colocar o Sleep (n) após o WaitForExit (). Exemplos: Aqui está um programa de exemplo que reproduz o problema para mim. Testei tanto no Windows XP quanto no Windows 7, e ambos, eventualmente, falharam em algum momento com o mesmo erro. Observe também que o executável ss. exe é um aplicativo simples e simples de console do quotHello Worldquot. E a saída geralmente parece ser uma coisa (com quantidade variável de iterações antes da ocorrência da falha): Qualquer idéia de por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código) sexta-feira, 8 de janeiro de 2010 3 : 40 PM O motivo é que, embora o processo seja concluído, pode demorar alguns milissegundos para que o sistema operacional termine de destruí-lo. É um sistema operacional multitarefa, está tentando atender todos ao mesmo tempo. Desnecessariamente, não há como saber quando o arquivo não está mais bloqueado (presitivamente). Quando WaitForExit, você está criando um objeto de bloqueio no objeto de processo. O objeto do processo não pode ser destruído até que o bloqueio seja liberado e você não pode esperar em algo que não existe (tipo de frango e ovo). 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, 8 de janeiro de 2010 4:20 PM mudou para bool, loop infinito Revisão sexta-feira, 08 de janeiro de 2010 16:15 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 participarMsiexec. exe Linha de comando A tecnologia Windows Installer usa Msiexec. exe para instalar pacotes MSI e MSP. Esta ferramenta dá-lhe um controle total sobre o processo de instalação, permitindo que você configure: opções de instalação (instalação, desinstalação, instalação administrativa, anunciar um produto) opções de exibição (total, básica ou nenhuma UI durante a instalação) reiniciar as opções (se a máquina Ser reiniciado após a instalação) Opções de registro opções de atualização (aplicar ou remover atualizações) opções de reparo (apenas para um pacote instalado) propriedades públicas que são usadas pela instalação A forma usual da linha de comando msiexec é esta: Instalar Opções Ao iniciar uma instalação Pacote, você pode configurar o tipo de instalação através dessas opções: i - instalação normal a - instalação administrativa j - anunciar o produto u - anunciar ao usuário atual m - anunciar a todos os usuários g - o identificador de idioma usado pelo pacote anunciado t - Aplicar transformar para anunciar o pacote x - desinstalar o pacote Exemplo de linha de comando: Opções de exibição O nível de interface do usuário da instalação pode ser configurado de acordo com o E ambiente alvo. Por exemplo, um pacote distribuído aos clientes deve ter uma UI completa, enquanto um pacote implantado através da Diretiva de Grupo não deve ter nenhuma interface do usuário. Msiexec. exe define o nível de UI da instalação através destas opções: silencioso - modo silencioso (não há interação do usuário) passivo - modo autônomo (a instalação mostra apenas uma barra de progresso) q - ajuste o nível de UI: n - não UI n - sem UI, exceto para uma caixa de diálogo modal exibida no final. B - UI básica b - UI básica com uma caixa de diálogo modal exibida no final. A caixa modal não é exibida se o usuário cancelar a instalação. Use qb ou qb para ocultar o botão Cancelar. B - - UI básica sem caixas de diálogo modal. Observe que qb não é um nível de UI suportado. Use qb ou qb para ocultar o botão Cancelar. R - UI reduzida - linha de comando de UI completa: Opções de reinício Às vezes, uma instalação substitui os arquivos que estão em uso ou precisa reiniciar a máquina para finalizá-la. A política de reinicialização usada pela instalação pode ser definida através dessas opções: norestart - a máquina não será reiniciada após a instalação estar concluída promptrestart - o usuário será solicitado se uma reinicialização for necessária forcerestart - a máquina será reiniciada após a instalação Complete a linha de comando da amostra: Opções de registro Ao depurar um pacote de instalação, você pode usar vários parâmetros de log para criar um registro. Este log contém informações diferentes para cada parâmetro que você usa: L - habilite o registro i - inclua mensagens de status w - inclua avisos não fatais e - inclua todas as mensagens de erro a - mencione quando uma ação é iniciada r - inclua registros específicos de ação - incluir solicitações de usuários c - incluir os parâmetros iniciais de interface do usuário m - incluir informações de saída de memória ou de saída fatal o - incluir mensagens de espaço fora do disco p - incluir propriedades de terminal v - saída detalhada x - incluir informações extras de depuração - Anexar a um arquivo de log existente - liberar cada linha para o registro - todas as informações, exceto o log de opções v e x - o equivalente a l Linha de comando da amostra: Opções de atualização A linha de comando do Windows Installer pode aplicar ou remover atualizações (patches, por exemplo, ) Através destas opções: p - instale um patch MSP. Ao instalar um patch silenciosamente, você precisa definir a propriedade REINSTALLMODE para ecmus e REINSTALLAR PARA TODOS. Caso contrário, o patch simplesmente atualizará o MSI em cache na máquina de destino. Atualização - aplique atualizações (se houver várias atualizações, você pode separá-las através do personagem). Desinstalar - remover uma atualização para um pacote de produto (se houver várias atualizações, você pode separá-las através do caractere) - especifica o pacote para o qual a atualização é removida. Linhas de comando de exemplo: na linha de comando acima, o primeiro GUID é o GUID de identificador de patch e o segundo é o código de produto do MSI para o qual o patch foi aplicado. Opções de reparo Se você tiver um pacote instalado, você pode usar a linha de comando do Windows Installer para repará-lo: f - reparar um pacote p - reparar somente se um arquivo estiver ausente o - reparar se um arquivo estiver ausente ou uma versão mais antiga estiver instalada e - reparar se o arquivo estiver faltando ou uma versão igual ou anterior estiver instalada d - reparar se um arquivo estiver ausente ou uma versão diferente instalada c - reparar se um arquivo estiver faltando ou a soma de verificação não corresponder ao valor calculado a - forçar todos os arquivos Para ser reinstalado - repare todas as entradas de registro específicas do usuário necessárias - repare todas as entradas de registro específicas do computador requeridas - repare todos os atalhos existentes v - execute a partir da fonte e recache o pacote local linha de comando da amostra: na linha de comando acima O GUID é o Código do Produto do MSI que será reparado. Definir propriedades públicas O nome de uma propriedade pública contém apenas letras maiúsculas (por exemplo, PROPRIEDADE). Esse tipo de propriedades pode ser configurado através da linha de comando como este: valor PROPERTY. Linha de comando da amostra:

Comments

Popular Posts