Pergunta

Eu estou tendo nenhum sucesso em modificar um instalador MSI Windows para executar um arquivo de lote após a saída primária foi instalado. Eu tenho procurado este e encontrou muitas sugestões, mas nada que funciona.

Adicionar uma ação personalizada
Ações personalizadas só podem ser arquivos executáveis. Um arquivo de lote não é executável.

Criar um executável Windows Scripting Host que executa o arquivo de lote
Muitas pessoas têm tentado fazer isso, inclusive sobre SO , e ninguém foi capaz de chegar a este trabalho.

Use WIX ou InstallShield
Eu não tenho o tempo ou autoridade para a tecnologia de alteração instalador empresa.

Editar o .msi com Orca e adicione uma propriedade personalizada, em seguida, uma ação personalizada, em seguida, editar o InstallExecuteSequence, ...
Eu tenho tentado isso por horas e só instaladores que lançam um erro de sistema quando eu executá-los.
criado
Foi útil?

Solução

O que você disse acima está incorreto:

Ações personalizadas só pode ser executável arquivos. Um arquivo de lote não é executável.

Ações personalizadas (mesmo sem ferramentas como o InstallShield) pode ser .exe, VBScript, JScript ou DLL base. Se você escrever uma DLL, você pode escrever qualquer código que você deseja chamar um arquivo de lote ou fazer as alterações desejadas para o sistema -. Não há limite

Atualizar : um exemplo que funcionou para mim: (entrada na tabela CustomAction)

Action Test
Type 34
Source SystemFolder
Target cmd.exe /c c:\test.bat
ExtendedType <blank>

Outras dicas

Eu era capaz de resolver isso criando um EXE que consiste essencialmente em:

System.Diagnostics.Process.Start(pathToBatchFile);

Adicionando o EXE para o arquivo MSI, em seguida, executá-lo como uma ação personalizada.

Enquanto a resposta sugerida por "William Leara" é um começo muito bom, eu encontrei uma solução melhor vale a pena aqui mencionar.

Outra vantagem deste método tem é que você pode colocar seu arquivo de lote na aplicação pasta de instalação, em vez de pasta raiz C, mas nós usamos sinalizadores especiais para adiar a execução para depois FileCopy ação, nós também uso noImpersonate a ter maior privilégio necessário para executar a partir de Arquivos de Programas

Algumas notas:

  1. Use TARGETDIR em vez de INSTALLDIR
  2. Certifique-se de citar os caminhos.

Estas são as minhas duas ações personalizadas. No meu caso eu quero força nativa processador de comandos para corrigir algumas entradas de registro, portanto, eu não uso COMSPEC .

comando

Primeira acção (tipo 50) executa na Fonte com argumentos de entrada de Target, porque o tipo é de 50 + 1024 + 2048 para isso é adiada ação com noImpersonate bandeira.

  • ação: FinalAction
  • Tipo: 3122
  • Fonte: NCOM
  • alvo: / c "[TARGETDIR] Fixup.bat"

Define segunda ação NCOM propriedade imediatamente:

  • ação: FinalNativeSys
  • Tipo: 51
  • Fonte: NCOM
  • alvo: [WindowsFolder] System32 \ cmd.exe

Em seguida, você deve adicionar essas ações para InstallExecuteSequence :

  • ação: FinalAction
  • Estado: NÃO instalada
  • Sequência: 5002

E esta:

  • ação: FinalNativeSys
  • Estado:
  • Sequência: 5001

Note que, no meu caso, eu poderia facilmente ajustar as ações a chamada importação reg.exe Fixup.reg também. Finalmente pode-se usar msitran como sugerido aqui em uma compilação de pós para automatizar o processo.

Faça um EXE que faz com que um arquivo .bat temporário para a mudança para o qualquer diretório que você quer e CALL outro arquivo bat que faz o que você precisa.

Diga a ação personalizada para usar esse exe.

O primeiro argumento para um exe CPP é o caminho para o próprio exe. Isso pode ser usado para orientar-se, e que a informação poderia ser usada na fabricação do .bat temporário

No meu caso, eu adicionei "Ações personalizadas".
Na pasta "Instalar" escolha "Adicionar ação personalizada"
Escolha cmd.exe (c: \ windows \ system32 \ cmd.exe)
Em seguida, nas propriedades do Cmd.exe editar "argumentos" para
"/ Instalar / c C: \ MyApp.exe --exec-alguma-action"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top