28

В проекте установки исполняемые файлы, такие как «.exe, .dll, .js, .vbs», являются приемлемыми, но нет способа запустить файл .bat в пользовательском действии.Как запустить файл «.bat» во время установки?

Вопрос в том, как запустить файлы *.bat во время установки?

+2

Вы проверили cmd.exe с xxxx.bat как параметр? – 2010-03-10 06:39:57

+0

№ Как это сделать? – mammadalius

ответ

54

Ну, после долгих поисков и проб и ошибок я решил это. Я не уверен, что это лучший способ, но он работает.

Вот сценарий: У меня есть приложение, которое я хотел бы развернуть с помощью проекта установки Visual Studio. В дополнение к моим файлам приложений, я хотел бы создать подкаталог в целевом каталоге, который содержит пакетный (.bat) файл. Я хотел бы, чтобы этот файл запускался в конце процесса установки.

Вот что вы делаете:

  1. Создать проект установки и настройки, как обычно, в том числе подкаталог, в котором вы будете размещать свой командный файл (вы можете просто поместить его в папке приложения непосредственно, если вы не хотите его в подкаталоге).
  2. В представлении «Файловая система» (щелкните правой кнопкой мыши по проекту в обозревателе решений -> Вид-> Файловая система) добавьте командный файл, который вы хотите выполнить и cmd.exe (C: \ Windows \ System32 \ cmd.exe)
  3. Открыть представление «Пользовательские действия» (щелкните правой кнопкой мыши по проекту в обозревателе решений -> Вид -> Пользовательские действия)
  4. Щелкните правой кнопкой мыши на «Commit» и выберите «Добавить пользовательское действие»,
  5. Перейдите и выберите cmd.exe.
  6. Откройте панель свойств для вновь созданного пользовательского действия.
  7. Удалить/Зафиксировать свойство Аргументы.
  8. Введите: /c "[TARGETDIR]subdirectoryname\batchfile.bat" в свойстве Аргументов, где subdirectoryname следует заменить на имя вашего подкаталога (если поставить пакетный файл в поддиректории, как я сделал ... если вы не сделали, то значение должно быть /c "[TARGETDIR]batchfile.bat") и batchfile.bat должно быть именем файла вашего командного файла.

Всё. Теперь пакетный файл будет выполнен после завершения остальной части процесса установки.

Вот пример для наглядности:

Мой командный файл: blah.bat
Мой подкаталог: MYDIR

Значение аргументов для моего пользовательского действия таргетинга CMD. ехе бы тогда

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

надежда, что Хель ps кто-то!

+6

В качестве дополнения я обнаружил, что запуск упакованного cmd.exe (в отличие от cmd.exe в каталоге System32) превращает все сообщения об ошибках из информационного сообщения в такие вещи, как «Система не может найти текст сообщения для номера сообщения 0x8», , Чтобы обойти это, вы можете (если вы точно знаете, что в системе32 на целевом компьютере будет существовать cmd.exe) используйте '/ c cmd.exe/c" TARGETDIR] подкаталог \ batchfile.bat ". Это приведет к тому, что упакованный cmd.exe вызовет родной cmd.exe на целевом компьютере, который даст правильные сообщения об ошибках. –

+1

Внимание: этот метод не работает, если установка создана под Windows 10 и выполняется под Windows 7! – Lumo

+0

@ Lumo: только для информации; опция с 'vbs' работает независимо от ОС. – Stefan

0

Если вы пытаетесь запустить командный файл с относительными путями во время процесса установки, это наверняка не удастся. Это связано с тем, что командный файл учитывает каталог, в котором работает установщик, а не там, где были установлены файлы. Используйте установщики установщика, которые копируют пакетные файлы во временный каталог.

4
  1. Проверьте эту статью (статья устарела), даже если она находится в VB.NET, она относится и к C#. Наиболее важная часть (переведенная на C#), создающая новую библиотеку классов, и добавление нового класса установщика со следующим содержимым: Как указано в статье, вы можете создать новое настраиваемое действие со ссылкой на только что созданный проект.

    override void Commit(IDictionary savedState) 
    { 
        base.Commit(savedState); 
        System.Diagnostics.Process.Start("myApp.bat","your bat arguments"); 
    } 
    
  2. Теперь мы добавляем пакетный файл к вашему проекту установщика. Создайте проект настройки и настройте, как обычно, включая подкаталог, в который вы поместите свой командный файл (вы можете просто поместить его в папку приложения напрямую, если вы не хотите его в подкаталоге).

  3. В представлении «Файловая система» (щелкните правой кнопкой мыши по проекту в обозревателе решений -> Вид-> Файловая система) добавьте командный файл, который вы хотите выполнить.

  4. Создайте проект установщика.

4

Другим способом достижения одного и того же результата является размещение файла .vbs в пользовательских действиях, выполняющих соответствующий файл .bat. Следующий код - «RunRegisterComponents.vbs», который я помещал в папку приложения-приложения. Конечно, я поместил [TARGETDIR] в качестве параметра .vbs в окне свойств 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) 

То есть, как я установил свои собственные действия:

enter image description here

Я надеюсь, что это может помочь вам!

+0

Я все еще думаю, что это лучший вариант, поскольку он не зависит от 'cmd.exe'. – Stefan

+0

Вы устанавливаете 'WshShell.CurrentDirectory' в каталог установки (' [TARGETDIR] '), не является ли избыточным размещение' programDir' в 'commandString' перед' RegisterComponents.bat'? – Wolf

Смежные вопросы