Как разобрать и изменить: Файл "Prog_Setup.exe" открываем в редакторе ресурсов (ресторатор допустим) Если нужно заменить иконку - меняем ресурс "Иконка - 1" . Сам скрипт это ресурс "SKRIPT > 101" , вытаскиваем ресурс 101 допустим на рабочий стол. . Открываем ресурс 101 в текстовом редакторе. (советую сохранить файл с разрешением wsc и открыть его в Notepad++ из этой темы Изменяем на свое усмотрение. В скрипте прописаны и закоментированны еще два чек бокса, куда можно добавить еще две программы не нарушая разметку окна.
Сам скрипт с описанием
Сам скрипт с описанием
CALC #XEnvi=0 ENVI pb=CALC Pbar1=%Pbar1%+%b% ENVI pb1=ENVI @Pbar1=%Pbar1% ENVI p=CALC n=%n%+1 CALL @Windows1 _SUB Windows1,W400H280,Установка программ,, // Размер основного окна и его название. LABE Label,L10T10W380H20,Выберите программы для установки ,,0xaaaaaa,16 // Местоположение надписи, цвет,размер шрифта. // рисуем чекбоксы CHEK Chk1,L15T40W150H20,7-Zip 19.00,,1 // Чек бокс и его местоположение в окне + Имя программы CHEK Chk2,L15T60W150H20,SumatraPDF 3.1.2,,1 CHEK Chk3,L15T80W150H20,UltraISO 9.7.2.3561,,1 CHEK Chk4,L15T100W150H20,WinRAR 5.71,,1 CHEK Chk5,L15T120W150H20,RuntimePack Lite,,1 //CHEK Chk6,L15T140W150H20,Новая программа,,0 CHEK Chk7,L220T40W250H20,Notepad++,,1 CHEK Chk8,L220T60W250H20,VLC,,1 CHEK Chk9,L220T80W250H20,XnShell,,1 CHEK Chk10,L220T100W250H20,Office2003micro,,1 CHEK Chk11,L220T120W250H20,DirectX 9.0c,,1 //CHEK Chk12,L220T140W250H20,Новая программа,,0 PBAR PBAR1,L15T180W365H20,, // Прогрес бар и его место положение в окне ENVI @Pbar1=-1 //Задаём начальное значение прогрес бара, при -1 он невидим ITEM Button1,L15T215W100H24,Снять выбор,CALL Slct // местоположение кнопки "выбрать все - снять выбор" ITEM Button2,L285T215W100H24,Установить,CALL puh // местоположение кнопки "установить" LABE h1,L130T200W120H24, ,,0x0000FF,14 // Местоположение надписи "установка.... - Готово", цвет,размер шрифта. _END //Подпрограмма кнопки "выбрать все - снять выбор" _SUB Slct FORX* 1 2 3 4 5 6 7 8 9 10 11 12,TEnvi,ENVI @Chk%TEnvi%.Check=%XEnvi% CALC XEnvi=lnot(%XEnvi%) FIND $%XEnvi%=0,ENVI @Button1=Снять выбор!ENVI @Button1=Выбрать всё _END //Окно "да-нет" _SUB puh MESS Установить выбранные приложения?@#YN FIND $%YESNO%=YES,CALL st FIND $%YESNO%=NO,EXIT _END //Подпрограмма прогрес бара _SUB st ENVI n=0 IFEX $%Chk1.Check%=1,%p% IFEX $%Chk2.Check%=1,%p% IFEX $%Chk3.Check%=1,%p% IFEX $%Chk4.Check%=1,%p% IFEX $%Chk5.Check%=1,%p% IFEX $%Chk6.Check%=1,%p% IFEX $%Chk7.Check%=1,%p% IFEX $%Chk8.Check%=1,%p% IFEX $%Chk9.Check%=1,%p% IFEX $%Chk10.Check%=1,%p% IFEX $%Chk11.Check%=1,%p% IFEX $%Chk12.Check%=1,%p% CALC b=100/%n% ENVI @Pbar1=0 CALL inst _END //Подпрограмма установки программ _SUB inst ENVI @h1=Установка ..... // Вывод надписи "Установка...." IFEX $%Chk1.Check%=1,TEAM EXEC ="%CurDir%\prog\7-Zip.exe" /ais|%pb%|%pb1% //Если отмечен чекбокс 1 запуск приложения по пути: каталог программы\prog\7-Zip.exe с параметром /ais IFEX $%Chk2.Check%=1,TEAM EXEC ="%CurDir%\prog\SumatraPDF" /ais|%pb%|%pb1% IFEX $%Chk3.Check%=1,TEAM EXEC ="%CurDir%\prog\UltraISO" /VERYSILENT|%pb%|%pb1% IFEX $%Chk4.Check%=1,TEAM EXEC ="%CurDir%\prog\WinRAR" /ais|%pb%|%pb1% IFEX $%Chk5.Check%=1,TEAM EXEC ="%CurDir%\prog\RuntimePack.exe" /y /gm2 /fm0|%pb%|%pb1% //IFEX $%Chk6.Check%=1,TEAM EXEC ="%CurDir%\prog\Новая программа"|%pb%|%pb1% IFEX $%Chk7.Check%=1,TEAM EXEC =*"%CurDir%\prog\Notepad++\npp.cmd"|%pb%|%pb1% IFEX $%Chk8.Check%=1,TEAM EXEC =*"%CurDir%\prog\VLC\vlc.cmd"|%pb%|%pb1% IFEX $%Chk9.Check%=1,TEAM EXEC =*"%CurDir%\prog\XnShell\XnShellEx.cmd"|%pb%|%pb1% IFEX $%Chk10.Check%=1,TEAM EXEC ="%CurDir%\prog\Office_micro\Office2003micro.exe" /y| EXEC ="%CurDir%\prog\Office_micro\Office2007support.exe"|%pb%|%pb1% IFEX $%Chk11.Check%=1,TEAM EXEC ="%CurDir%\prog\DirectX.exe"|%pb%|%pb1% //IFEX $%Chk12.Check%=1,TEAM EXEC ="%CurDir%\prog\Новая программа"|%pb%|%pb1% ENVI @h1=ГОТОВО! // Вывод надписи "ГОТОВО" TIPS Выбранные приложения установленны!!!, \n,5000,1, //Вывод надписи в трее, 5000-задержка в милисекундах. _END
puhpol, Я тут решил немного поиграться с PeCmd, в качестве тестовой задачки взял твой скрипт как пример, с GUI никогда до этого в PeCmd не работал. Получилась вот такая хреновина, может пригодится.
Скрытый текст
Код:
envi i=0 //Добавляем пункты в меню, название, тип запуска, путь, время выполнения (для прогресса) ArrayAdd "Proga1" "-wait" "%CurDir%\prog\Proga1.cmd" 10 ArrayAdd "Proga2" "-wait" "%CurDir%\prog\Proga1.cmd" 50 ArrayAdd "Proga3" "-wait" "%CurDir%\prog\Proga1.cmd" 20 ArrayAdd "Proga4" "-wait" "%CurDir%\prog\Proga1.cmd" 70 ArrayAdd "Proga5" "-wait" "%CurDir%\prog\Proga1.cmd" 20 //%n% - к-во пунктов меню calc n=%i% - 1 //Вычисляем размер окна calc w=400 calc h=int(%n%/2)*20 + 170 //Создаем основное окно @Windows %w% %h% exit _sub Windows,w%1h%2,Установка программ,, // Размер основного окна и его название. labe Label1,l10t10w%1h20,Выберите программы для установки ,,0xaaaaaa,16 // Местоположение надписи, цвет,размер шрифта. //Инфо calc l=15 calc t=int(%n%/2)*20 + 64 labe Label2,l%l%t%t%w%1h20,====== Привет ====== //Создаем в цикле Чек боксы envi i=0 loop %i%<=%n%, { calc l=mod(%i%,2)*205 + 15 calc t=int(%i%/2)*20 + 40 chek Chk[%i%],l%l%t%t%w150h20,%Name[%i%]%,,1 // Чек бокс и его местоположение в окне + Имя программы calc i=%i% + 1 } //Кнопки calc l=15 calc t=int(%n%/2)*20 + 108 item Button1,l%l%t%t%w100h24,Выбрать все,Sel 1 // местоположение кнопки "выбрать все" calc l=120 item Button2,l%l%t%t%w100h24,Снять выбор,Sel 0 // местоположение кнопки "снять выбор" calc l=280 item Button3,l%l%t%t%w100h24,Установить,Install // местоположение кнопки "Установить" calc l=15 calc t=int(%n%/2)*20 + 84 pbar Pbar,l%l%t%t%w365h20,, // Прогрес бар и его место положение в окне _end _sub ArrayAdd envi Name[%i%]=%~1 envi StartType[%i%]=%~2 envi InstString[%i%]=%~3 envi InstTime[%i%]=%~4 calc i=%i% + 1 _end _sub Sel envi i=0 loop %i%<=%n%, { envi @Chk[%i%].Check=%1 calc i=%i% + 1 } _end _sub CheckSel //Вычисляем общее время выполнения выбранных пунктов envi SummaryTime=0 envi i=0 loop %i%<=%n%, { ifex $%Chk[%i%].Check%=1,calc SummaryTime=%SummaryTime% + %InstTime[%i%]% calc i=%i% + 1 } _end _sub Install mess Установить выбранные приложения?@#YN find $%YESNO%=YES, { envi @Pbar=0 CheckSel envi CurrentTime=0 envi i=0 loop %i%<=%n%, { ifex $%Chk[%i%].Check%=1, { envi @Label2=*** Установка %Name[%i%]% *** exec %StartType[%i%]% %InstString[%i%]% calc CurrentTime=%CurrentTime% + %InstTime[%i%]% calc Percent=%CurrentTime%/%SummaryTime%*100 envi @Pbar=%Percent% envi @Chk[%i%].Check=0 } calc i=%i% + 1 } envi @Label2=*** Все задания выполнены !!! *** } _end
Скрипт сырой, много лишнего, чисто демка, но рабочая.
nikzzzz, Твой вариант легче редактировать. Но возникает вопрос: Откуда берется "время выполнения (для прогресса)"? Засекать время не вариант, на одной машине 2 минуты на другой 4..... Точность особо не нужна, так визуально видно что что то происходит.
74049 Но возникает вопрос: Откуда берется "время выполнения (для прогресса)"? Засекать время не вариант, на одной машине 2 минуты на другой 4.....
Без разницы, можешь указать от фонаря, например все единицы поставить, но тогда полоса прогресса будет пропорциональна не времени, а к-ву установленных приложений. Важно относительное время, например одно приложение ставится в десять раз медленнее другого, пишем для первого 10, для второго 1, реальное время установки не используется.
nikzzzz, раз пошла такая пьянка, тогда уже лучше читать данные из внешнего файла конфига. Для примера, если наша утиль будет иметь имя MySetup.exe, тогда конфиг MySetup.cfg
Читаем конфиг
Читаем конфиг
CALC #i=0 //Переменная для подсчета количества программ CALC #NEnvi=0 //Переменная для перебора строк FNAM TEnvi=%MyName% //Получаем в TEnvi имя запущенного файла ENVI TEnvi=%TEnvi%.cfg //Генерируем имя конфига (имя файла с расширением cfg) IFEX %CurDir%\%TEnvi%, //Если найден конфиг {* READ %CurDir%\%TEnvi%,*r,DataCFG //Читаем содержимое конфига в переменную DataCFG READ -,-1,DEnvi,%DataCFG% //Считаем количество строк в конфиге LOOP #%NEnvi%<%DEnvi%, //Цикл чтения из конфига {* READ -,%NEnvi%,XEnvi,%DataCFG% //Читаем в XEnvi строку %NEnvi% CALC #NEnvi=%NEnvi%+1 //Увеличиваем номер строки MSTR -delims:# TEnvi=<4>%XEnvi% //Читаем в переменную TEnvi последнее слово строки FIND $%TEnvi%<>, //Если последнее слово есть, тогда {* CALC #i=%i%+1 //Увеличиваем количество программ MSTR -delims:# Name%i%,StartType%i%,InstString%i%,InstTime%i%=<1*>%XEnvi% //Вносим значения из строки в переменные (разделителем значений служит символ #) MESS %Name%i%%,%StartType%i%%,%InstString%i%%,%InstTime%i%% //Индикация для теста } } ! EXIT //Если конфиг не найден, выход из программы
Если совместить с демкой от nikzzzz
Если совместить с демкой от nikzzzz
CALC #i=0 CALC #NEnvi=0 FNAM TEnvi=%MyName% ENVI TEnvi=%TEnvi%.cfg IFEX %CurDir%\%TEnvi%, {* READ %CurDir%\%TEnvi%,*r,DataCFG READ -,-1,DEnvi,%DataCFG% LOOP #%NEnvi%<%DEnvi%, {* READ -,%NEnvi%,XEnvi,%DataCFG% CALC #NEnvi=%NEnvi%+1 MSTR -delims:# TEnvi=<4>%XEnvi% FIND $%TEnvi%<>, {* MSTR -delims:# Name[%i%],StartType[%i%],InstString[%i%],InstTime[%i%]=<1*>%XEnvi% CALC #i=%i%+1 } } ! EXIT //---------------------------------------------------------------- //%n% - к-во пунктов меню calc #n=%i% //Вычисляем размер окна calc w=400 calc h=int(%n%/2)*20 + 170 //Создаем основное окно @Windows %w% %h% exit _sub Windows,w%1h%2,Установка программ,, // Размер основного окна и его название. labe Label1,l10t10w%1h20,Выберите программы для установки ,,0xaaaaaa,16 // Местоположение надписи, цвет,размер шрифта. //Инфо calc l=15 calc t=int(%n%/2)*20 + 64 labe Label2,l%l%t%t%w%1h20,====== Привет ====== //Создаем в цикле Чек боксы envi i=0 loop %i%<%n%, { calc l=mod(%i%,2)*205 + 15 calc t=int(%i%/2)*20 + 40 chek Chk[%i%],l%l%t%t%w150h20,%Name[%i%]%,,1 // Чек бокс и его местоположение в окне + Имя программы calc i=%i% + 1 } //Кнопки calc l=15 calc t=int(%n%/2)*20 + 108 item Button1,l%l%t%t%w100h24,Выбрать все,Sel 1 // местоположение кнопки "выбрать все" calc l=120 item Button2,l%l%t%t%w100h24,Снять выбор,Sel 0 // местоположение кнопки "снять выбор" calc l=280 item Button3,l%l%t%t%w100h24,Установить,Install // местоположение кнопки "Установить" calc l=15 calc t=int(%n%/2)*20 + 84 pbar Pbar,l%l%t%t%w365h20,, // Прогрес бар и его место положение в окне _end _sub Sel envi i=0 loop %i%<=%n%, { envi @Chk[%i%].Check=%1 calc i=%i% + 1 } _end _sub CheckSel //Вычисляем общее время выполнения выбранных пунктов envi SummaryTime=0 envi i=0 loop %i%<=%n%, { ifex $%Chk[%i%].Check%=1,calc SummaryTime=%SummaryTime% + %InstTime[%i%]% calc i=%i% + 1 } _end _sub Install mess Установить выбранные приложения?@#YN find $%YESNO%=YES, { envi @Pbar=0 CheckSel envi CurrentTime=0 envi i=0 loop %i%<=%n%, { ifex $%Chk[%i%].Check%=1, { envi @Label2=*** Установка %Name[%i%]% *** exec %StartType[%i%]% %InstString[%i%]% calc CurrentTime=%CurrentTime% + %InstTime[%i%]% calc Percent=%CurrentTime%/%SummaryTime%*100 envi @Pbar=%Percent% envi @Chk[%i%].Check=0 } calc i=%i% + 1 } envi @Label2=*** Все задания выполнены !!! *** } _end
В конфиге допускаются некорректные строки (т.е., пустые строки, или строки, в которых отсутствует значение после трёх символов "#") - все они будут просто проигнорированы. Разделителем служит символ "#", и, соответственно, он не должен присутствовать ни в пути, ни в имени программ. Если подправить код, можно использовать некоторые другие разделители, например, "^","&","*".
74053тогда уже лучше читать данные из внешнего файла конфига.
Да я и писал так, что бы это было легко добавить, я пока еще не разбирался с чтением из файла и парсингом, спасибо за пример. Вопросик, ты используешь "calc #n=%i%", а в чем различие от "calc n=%i%" ?
conty9 писал(а):
74053можно использовать некоторые другие разделители, например, "^","&","*".
А что надо подправить, чтобы использовать к примеру "," , в путях он не используется, обрамлять в кавычки?
Всем здрасте! nikzzzz, Часто вижу в названии каталога торрент-раздачи присутствие запятой "," Далеко ходить не буду, взять хотя бы эту раздачу: http://nnmclub.to/forum/viewtopic.php?t=1331710 Каталог с раздачей: Windows Server, Version 1909 (10.0.18363.418)- Оригинальные образы от Microsoft MSDN [En-Ru] И зачастую пользователи не заморачиваются после скачивания, в какой папке(по какому пути) у них лежит та или иная раздача
nikzzzz, символ # в CALC означает, что это будет простое целое число, а не реальное. Просто экономия памяти, выделяемой под переменную. По поводу путей: PеCMD при запуске нормально обработает пути с пробелами. Для правильной обработки прочих символов, как "," - просто нужно обеспечить, чтобы команда EXEC была единственной в строке (используем скобки {} или создаём подпрограмму, при необходимости). Т.е., обеспечиваем правильную интерпретацию синтаксиса отсутствием предварительных комманд, которые могут использовать запятую как разделитель. Также можно использовать и кавычки. Кроме того, если внешней программе передается путь как параметр, тогда кавычки необходимы.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы