понедельник, 16 апреля 2018 г.

Msiexec waitforexit


Msiexec waitforexit
Dia bom! Estou trabalhando no instalador, que instala dependências adicionais para o meu software usando o Process. Start.
O problema é quando outra instalação msi é executada, WaitForExit trava (e quando eu fechar esta outra instalação msi, WaitForExit também sai).
Eu não posso usar tempos limite, porque as dependências são diferentes com o tempo de instalação muito diferente.
Existe alguma maneira de lidar com esta situação e matar corretamente o processo (na verdade, eu quero saber se a dependência está instalando ou apenas pendurada)? Muito Obrigado.
Solução: no meu caso o problema é resolvido verificando se o processo 'msiexec' está rodando.
A solução para o meu problema - verifique mutex global, criado por msiexec. Essa também é uma maneira correta de verificar se outra instalação do msi está em execução.

Msiexec waitforexit
Gostaria de instalar um conjunto de aplicativos: 4, snap-ins do IIS 7 PowerShell, ASP MVC 3 etc. Como faço para instalar os aplicativos e retornar um valor que determine se a instalação foi bem-sucedida ou não?
Todas essas respostas parecem ou excessivamente complicadas ou incompletas. Executar um instalador no console do PowerShell tem alguns problemas. Um MSI é executado no subsistema Windows, portanto, você não pode invocá-los (Invoke-Expression ou & amp;). Algumas pessoas reivindicam que esses comandos funcionem canalizando para Out-Null ou Out-Host, mas eu não observei isso para funcionar.
O método que funciona para mim é Start-Process com os parâmetros de instalação silenciosa para msiexec.
Você pode obter o código de saída do comando Start-Process e inspecioná-lo quanto a valores de aprovação / reprovação. (e aqui está a referência do código de saída)
Depende MSIs podem ser instaladas usando o WMI. Para exes e outros métodos, você pode usar Start-Process e verificar o Process ExitCode.
msi também pode ser instalado usando o msiexec. exe, o msu pode ser instalado usando o wusa. exe, ambos têm um switch / quiet, / norestart e / forcerestart switches e uma opção / log para logging (especifique o nome do arquivo).
Você pode ler mais sobre as opções se as chamar com /?
Nota: wusa falha silenciosamente quando eles falham, portanto, você deve verificar o arquivo de log ou o log de eventos para determinar o sucesso.
Eu implementei exatamente o que você está procurando no meu projeto atual. Precisamos automatizar a implantação e a instalação de um número n de aplicativos em vários ambientes e datacenters. Esses scripts são um pouco modificados da versão original para simplificar, já que meu código completo está atingindo 1.000 linhas, mas a funcionalidade principal está intacta. Espero que isso faça o que você está pedindo.
Esta função PS extrai todos os aplicativos do registro (o que os programas add / remove lêem) e, em seguida, pesquisa o nome do aplicativo fornecido e a versão de exibição. No meu código (PSM1) eu executo essa função antes de instalar se ela é ou não a deles e depois a do postpository para verificar se ela foi instalada…. Tudo isso pode ser agrupado em uma função mestre para o controle de fluxo do gerenciador.
Esta função PS carregará um arquivo txt que possui os comandos de instalação pré-preenchidos (um comando por linha). e execute cada linha individualmente e espere a instalação ser concluída antes de passar para a próxima.
O arquivo TXT deve ser formatado como tal. você precisará pesquisar em como cada aplicativo precisa ser instalado. um bom recurso é appdeploy.
Deixe-me saber se há algum erro que tive para modificar meu código existente para remover os valores proprietários e tornar isso um pouco mais simplista. Eu estou puxando meus valores de uma folha de respostas XML personalizada. Mas este código deve funcionar como eu forneci.
Se você quiser que eu discuta mais sobre a minha implementação, me avise e posso fazer uma explicação mais detalhada e também adicionar mais funções de suporte que implementei.

execute msiexec a partir do código c #.
procinfo. FileName = @ & quot; \\ caminho \. \. \. \ setup. msi & quot; pa para o setup. msi.
procinfo. Arguments = "Arg 1 = x Arg 2 = y" // argumentos.
System. Diagnostics. Process proc; // Declara o novo processo proc.
proc = System. Diagnostics. Process. Start (pro cinfo); // executa o setup a partir da linha de comando.
proc. WaitForExit (); // Espera que o processo termine.
Facebook Twitter LinkedIn especialistas-troca / perguntas / 21715781 / executar-msiexec-de-c-net-code. html cópia.
gregoryyoung (2 comentários)
Postagem em destaque
Pesquisa Anual de Sócios de 2018.
Aqui na Experts Exchange, nós nos esforçamos para dar aos membros a melhor experiência. Ajude-nos a melhorar o site fazendo esta pesquisa hoje! (Bônus: seja inscrito para ganhar um ótimo prêmio de tecnologia por participar!)

Msiexec waitforexit
Eu preciso executar uma linha de comando MSIEXEC de um PowerShell e verificar se a instalação foi bem-sucedida ou não.
msiexec. exe / qn / l * v e: /tmp/surfaceruntime. log / i '\\ nas \ lui \ tools \ surfaceruntime2.msi'
(onde o MSI especificado não existe - para fins de teste)
Eu recebo um $ LASTEXITCODE de 1.
Eu recebo 1619 (o mesmo que% ERRORLEVEL% se eu executar a linha de comando do CMD).
Como é que o $ LASTEXITCODE está incorreto?
Editado por sba quinta-feira, 8 de novembro de 2012 11:18.
Se msiexec for executado a partir do console, o controle retornará para o console ou script imediatamente e a variável $ LASTEXITCODE (% ERRORLEVEL%) sendo configurada de acordo não será.
Para obter o código de saída correto, você precisa aguardar a saída msiexec:
1) cmd / c msiexec.
Editado por Kazun quinta-feira, 8 de novembro de 2012 11:37 Enviado por answer Blindrood quinta-feira, 8 de novembro de 2012 12:26 Marcado como resposta por sba quinta-feira, 8 de novembro de 2012 12:27.
Eu acho que agora entendi a foto.
Por algum motivo, o msiexec. exe é um binário do subsistema da GUI, não um binário do subsistema da CLI. Essa foi a primeira e principal coisa que me confundiu. Eu não esperava isso.
Então, o (não tão bem documentado, se você me perguntar) do CMD e do PowerShell é que invocar uma linha de comando para um binário da GUI apenas gerará o processo e retornará ao prompt. O resultado é que% ERRORLEVEL% / $ LASTEXITCODE é deixado inalterado nesse caso (e quando eu estava experimentando no CMD eu assumi que o valor estava correto. Mas isso porque os comandos anteriores tinham definido ERRORLEVEL, não o último).
Observe que no CMD parece que há também uma "solução alternativa":
iniciar / esperar msiexec.
Marcado como Resposta sba quinta, 08 de novembro de 2012 12:28.
Todas as respostas.
Você está perdendo meu ponto.
1. A solução com [System. Diagnostics. Process] :: Start funciona corretamente e me obtém o código de saída real do msiexec. exe.
2. A solução com & quot; msiexec. & quot; não me pega o código de saída correto (via $ LASTEXITCODE)
P. S. é preciso usar uma matriz como o segundo argumento para Start (), em vez de uma string, no caso de alguns dos argumentos poderem conter espaços.
Se msiexec for executado a partir do console, o controle retornará para o console ou script imediatamente e a variável $ LASTEXITCODE (% ERRORLEVEL%) sendo configurada de acordo não será.
Para obter o código de saída correto, você precisa aguardar a saída msiexec:
1) cmd / c msiexec.
Editado por Kazun quinta-feira, 8 de novembro de 2012 11:37 Enviado por answer Blindrood quinta-feira, 8 de novembro de 2012 12:26 Marcado como resposta por sba quinta-feira, 8 de novembro de 2012 12:27.
Eu acho que agora entendi a foto.
Por algum motivo, o msiexec. exe é um binário do subsistema da GUI, não um binário do subsistema da CLI. Essa foi a primeira e principal coisa que me confundiu. Eu não esperava isso.
Então, o (não tão bem documentado, se você me perguntar) do CMD e do PowerShell é que invocar uma linha de comando para um binário da GUI apenas gerará o processo e retornará ao prompt. O resultado é que% ERRORLEVEL% / $ LASTEXITCODE é deixado inalterado nesse caso (e quando eu estava experimentando no CMD eu assumi que o valor estava correto. Mas isso porque os comandos anteriores tinham definido ERRORLEVEL, não o último).
Observe que no CMD parece que há também uma "solução alternativa":
iniciar / esperar msiexec.
Marcado como Resposta sba quinta, 08 de novembro de 2012 12:28.
A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.

Msiexec waitforexit
Eu preciso executar uma linha de comando MSIEXEC de um PowerShell e verificar se a instalação foi bem-sucedida ou não.
msiexec. exe / qn / l * v e: /tmp/surfaceruntime. log / i '\\ nas \ lui \ tools \ surfaceruntime2.msi'
(onde o MSI especificado não existe - para fins de teste)
Eu recebo um $ LASTEXITCODE de 1.
Eu recebo 1619 (o mesmo que% ERRORLEVEL% se eu executar a linha de comando do CMD).
Como é que o $ LASTEXITCODE está incorreto?
Editado por sba quinta-feira, 8 de novembro de 2012 11:18.
Se msiexec for executado a partir do console, o controle retornará para o console ou script imediatamente e a variável $ LASTEXITCODE (% ERRORLEVEL%) sendo configurada de acordo não será.
Para obter o código de saída correto, você precisa aguardar a saída msiexec:
1) cmd / c msiexec.
Editado por Kazun quinta-feira, 8 de novembro de 2012 11:37 Enviado por answer Blindrood quinta-feira, 8 de novembro de 2012 12:26 Marcado como resposta por sba quinta-feira, 8 de novembro de 2012 12:27.
Eu acho que agora entendi a foto.
Por algum motivo, o msiexec. exe é um binário do subsistema da GUI, não um binário do subsistema da CLI. Essa foi a primeira e principal coisa que me confundiu. Eu não esperava isso.
Então, o (não tão bem documentado, se você me perguntar) do CMD e do PowerShell é que invocar uma linha de comando para um binário da GUI apenas gerará o processo e retornará ao prompt. O resultado é que% ERRORLEVEL% / $ LASTEXITCODE é deixado inalterado nesse caso (e quando eu estava experimentando no CMD eu assumi que o valor estava correto. Mas isso porque os comandos anteriores tinham definido ERRORLEVEL, não o último).
Observe que no CMD parece que há também uma "solução alternativa":
iniciar / esperar msiexec.
Marcado como Resposta sba quinta, 08 de novembro de 2012 12:28.
Todas as respostas.
Você está perdendo meu ponto.
1. A solução com [System. Diagnostics. Process] :: Start funciona corretamente e me obtém o código de saída real do msiexec. exe.
2. A solução com & quot; msiexec. & quot; não me pega o código de saída correto (via $ LASTEXITCODE)
P. S. é preciso usar uma matriz como o segundo argumento para Start (), em vez de uma string, no caso de alguns dos argumentos poderem conter espaços.
Se msiexec for executado a partir do console, o controle retornará para o console ou script imediatamente e a variável $ LASTEXITCODE (% ERRORLEVEL%) sendo configurada de acordo não será.
Para obter o código de saída correto, você precisa aguardar a saída msiexec:
1) cmd / c msiexec.
Editado por Kazun quinta-feira, 8 de novembro de 2012 11:37 Enviado por answer Blindrood quinta-feira, 8 de novembro de 2012 12:26 Marcado como resposta por sba quinta-feira, 8 de novembro de 2012 12:27.
Eu acho que agora entendi a foto.
Por algum motivo, o msiexec. exe é um binário do subsistema da GUI, não um binário do subsistema da CLI. Essa foi a primeira e principal coisa que me confundiu. Eu não esperava isso.
Então, o (não tão bem documentado, se você me perguntar) do CMD e do PowerShell é que invocar uma linha de comando para um binário da GUI apenas gerará o processo e retornará ao prompt. O resultado é que% ERRORLEVEL% / $ LASTEXITCODE é deixado inalterado nesse caso (e quando eu estava experimentando no CMD eu assumi que o valor estava correto. Mas isso porque os comandos anteriores tinham definido ERRORLEVEL, não o último).
Observe que no CMD parece que há também uma "solução alternativa":
iniciar / esperar msiexec.
Marcado como Resposta sba quinta, 08 de novembro de 2012 12:28.
A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da Technet. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site da Technet.

Processo . Método WaitForExit (Int32)
A documentação de referência da API tem uma nova casa. Visite o Navegador da API em docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar o número especificado de milissegundos para o processo associado sair.
Assembly: System (no System. dll)
Parâmetros
O período de tempo, em milissegundos, para aguardar a saída do processo associado. O máximo é o maior valor possível de um inteiro de 32 bits, que representa infinito para o sistema operacional.
Valor de retorno.
true se o processo associado tiver saído; Caso contrário, false.
A configuração de espera não pôde ser acessada.
Nenhuma identificação de processo foi definida e uma Handle da qual a propriedade Id pode ser determinada não existe.
Não há processo associado a este objeto Process.
Você está tentando chamar WaitForExit (Int32) para um processo que está sendo executado em um computador remoto. Este método está disponível apenas para processos em execução no computador local.
WaitForExit (Int32) faz com que o segmento atual espere até que o processo associado termine. Deve ser chamado depois que todos os outros métodos forem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exited.
Este método instrui o componente Process a aguardar uma quantidade finita de tempo para o processo sair. Se o processo associado não sair no final do intervalo porque a solicitação para finalizar é negada, false é retornado para o procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Processo. WaitForExit (Int32) se comportará da mesma maneira que a sobrecarga WaitForExit (). Se você passar 0 (zero) para o método, ele retornará true somente se o processo já tiver saído; caso contrário, retorna imediatamente false.
No Framework 3.5 e em versões anteriores, se milissegundos fosse -1, a sobrecarga WaitForExit (Int32) aguardava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente.
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento assíncrono de eventos tenha sido concluído, chame a sobrecarga WaitForExit () que não recebe nenhum parâmetro após receber um valor verdadeiro dessa sobrecarga. Para ajudar a garantir que o evento Exited seja tratado corretamente nos aplicativos do Windows Forms, defina a propriedade SynchronizingObject.
Quando um processo associado sai (é desligado pelo sistema operacional por meio de uma finalização normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (Int32). O componente de processo pode acessar as informações, que inclui o ExitTime, usando o identificador para o processo de saída.
Como o processo associado foi encerrado, a propriedade Handle do componente não aponta mais para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos. Por esse motivo, sempre que você chamar a instância Start for Process, chame Close quando o processo associado tiver terminado e você não precisar mais de nenhuma informação administrativa sobre ele. Close libera a memória alocada para o processo finalizado.
Veja o exemplo de código para a propriedade ExitCode.
para confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Комментариев нет:

Отправить комментарий