Pergunta

Em um projeto de instalação dos arquivos executáveis, como ".exe, .dll, .js, .vbs" são aceitáveis, mas não há nenhuma maneira para executar um arquivo .bat em uma ação personalizada.

A questão é como executar os arquivos *.bat durante a instalação?

Foi útil?

Solução

Bem, depois de muita pesquisa e tentativa e erro eu ter resolvido isso. Eu não tenho certeza se esta é a melhor maneira, mas funciona.

Aqui está o cenário: Eu tenho um aplicativo que eu gostaria de implantar através de um projeto de instalação do Visual Studio. Além de meus arquivos do aplicativo, eu gostaria de criar um subdiretório no diretório de destino que contém um arquivo de lote (.bat). Gostaria que este arquivo para executar no final do processo de instalação.

Aqui está o que você faz:

  1. Criar um projeto de instalação e configure como faria normalmente, incluindo o subdiretório em que você vai colocar o seu arquivo de lote (você pode simplesmente colocá-lo na pasta do aplicativo diretamente, se você não quer em um subdiretório).
  2. Na visão "File System" (botão direito do mouse no projeto no Solution Explorer-> Ver-> File System), adicione o arquivo de lote que você quer executar e cmd.exe (C : cmd.exe \ Windows \ System32 \)
  3. Abra o "Custom Actions" view (clique com o botão direito sobre o projeto em Solution Explorer-> Ver-> Ações personalizadas)
  4. Clique com o botão direito do mouse em "Commit" e escolha "Adicionar ação personalizada"
  5. Navegue e selecione cmd.exe.
  6. Abra o painel de propriedades para a ação personalizada recém-criado.
  7. Excluir / Commit da propriedade Argumentos.
  8. Digite: /c "[TARGETDIR]subdirectoryname\batchfile.bat" na propriedade Argumentos, onde subdirectoryname deve ser substituído pelo nome de seu subdiretório (se você colocar o arquivo de lote em um subdiretório como eu fiz ... se você não fez , o valor deve ser /c "[TARGETDIR]batchfile.bat") e batchfile.bat deve ser o nome do arquivo do seu arquivo em lotes.

É isso. O arquivo de lote irá agora ser executado uma vez o resto do processo de instalação seja concluída.

Aqui está um exemplo de uma questão de clareza:

Meu arquivo de lote: blah.bat
Meu subdiretório: meudir

O valor dos argumentos para a minha ação segmentação personalizada cmd.exe seria então

/c "[TARGETDIR]mydir\blah.bat"

Espero que ajude alguém!

Outras dicas

  1. Verifique este artigo (artigo está obsoleta), mesmo que seja em VB.NET ele se aplica ao C # bem. A parte mais importante é (traduzido para C #) a criação de uma nova biblioteca de classes, e adicionando uma nova classe Installer com o seguinte conteúdo: Como se afirma no artigo que você pode, então, criar uma nova ação personalizada com uma referência ao seu projeto recém-criado <. / p>

    override void Commit(IDictionary savedState)
    {
         base.Commit(savedState);
         System.Diagnostics.Process.Start("myApp.bat","your bat arguments");
    }
    
  2. Agora estamos adicionando arquivo de lote para o seu projeto de instalação. Criar um projeto de instalação e configure como faria normalmente, incluindo o subdiretório em que você vai colocar o seu arquivo de lote (você pode simplesmente colocá-lo na pasta do aplicativo diretamente, se você não quer em um subdiretório).

  3. Na visão "File System" (botão direito do mouse no projeto no Solution Explorer-> Ver-> File System), adicione o arquivo de lote que você deseja executar.

  4. Crie o projeto de instalação.

Uma outra maneira de chegar ao mesmo resultado é colocar um arquivo .vbs em ações personalizadas que executa o correspondente arquivo .bat. O código a seguir é o "RunRegisterComponents.vbs" Eu coloquei na pasta aplicativo de configuração. É claro que eu colocar [TARGETDIR] como parâmetro .vbs na janela de propriedades do Visual Studio.

dim WshShell
Set WshShell = CreateObject("WScript.Shell")

' Read the "CustomActionData" property holding the install directory.
dim programDir
programDir=  property("CustomActionData")

' Make the batch full file name and parameter
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) &
programDir& chr(34)

' Set the current directory
WshShell.CurrentDirectory = programDir

' Run batch.
ret = WshShell.Run (commandString, 0, 0)

Isso é como eu definir o meu ações personalizadas:

enter descrição da imagem aqui

Espero que isso pode ajudá-lo!

Se você está tentando executar um arquivo em lotes que têm caminhos relativos durante o processo de instalação, que irá falhar com certeza. Isso porque o arquivo de lote terá em conta o diretório onde o instalador está sendo executado, e não onde os arquivos estavam sendo instalado. construtores uso do instalador que copia arquivos em lote em diretório temporário.

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