[Цитировать]

    korsak7
  • 107
  • Стаж: 9 лет 3 месяца
  • Сообщений: 1082
  • Репутация:62

    [+] [-]
Господа конструкторы и сочувствующие!
Как вы знаете (а если не знаете, то много потеряли - например в сборке 2k10 автозагрузка и управление WinPE сделано именно на этой программе), существует замечательная программа PECMD китайского сотоварища.

Краткий обзор

Welcome PECMD2012 - WinPE Commander, func WinPE command interpreter powerful tool!
PECMD - XCMD V2.2 complement version, based on the increase in XCMD V2.2 of CALL, HOTK, FBWF and other commands, to express my gratitude to Yonsm etc!
PECMD2012 Official Website: http: //mdyblog.blog.163.com/blog/static/106150119201202591855298/
PECMD2012 NonCopyRight, any individuals and organizations (including business organizations) can easily free to use, free to modify, .... Technical support may consult Author
PECMD2012 PECMD2.4 reference source, re-designed. Help document finishing typesetting --988 668 @ May 10, 2012 (appendix!)
──vers───────────────────────────────────────────────────
☆PECMD v2012.1.79.59 fix10 X86U (J2D3)
──Feat───────────────────────────────────────────────────
★ dapper, run fast; conventional extended support setting commands; built-in multiple commands, func extremely powerful; support call external EXE and DLL function;
★ Support frmt unified command line para and configuration files, log operate entirely using INI file configuration, modify INI able to fully control the login procedure;
★ support modular, structured and scripted configuration files; profile support line after line comments and notes, as well as support spaces indented.
──use───────────────────────────────────────────────────
◎ using the command line para, for example: To set the environment variable, perform "PECMD.EXE ENVI $ PPPoE = OK" can be.
◎ using the configuration file, for example: "PECMD.EXE LOAD% SystemRoot% \ PECMD.INI".
◎ without command line para, direct the implementation of this program will display this help; for more information about the description of the problem, see "HELP" command para.
◎ para command parsing support environment variables (eg "% TEMP% \ X.TXT"); command is not case-sensitive; angle brackets "<>" para representation must be entered within the square
brackets "[]" within can be omitted.
◎ command-line mode is disabled by default comment (not LOAD execution); script mode is enabled by default comment (LOAD execution) can be used to switch NOTE or COME.
◎ Normally, you only need to edit a configuration file to a location on the disk PECMD.INI, which lists the commands to be executed. Then
perform "PECMD.EXE MAIN INI file name (including the path, supportive environment variable)" to the WinPE boot time.
◎ script files frmt support WCE, WCI, WCS, WCX, INI, INF, TXT, LOG, etc., and any self-appointed frmt, in order to standardize, PE of LOAD
configuration file with the INI, the driver installation with INF, while the script is used WCE, WCI, WCS, WCX; individual tests suggested WCI WCX or file
former name with a custom comment character; and compression general use WCZ, WCM, WZM other logs using LOG (default), built-in help text
encoded using TXT-ANSI. Custom scripts frmt custom scripts must ensure compliance with system-defined text frmt script specification standard, or else be wrong!
▲ Note: LOAD command if the actual path, the path contains a space in it, '"quotes must not be omitted because LOAD can take para. Such as:
LOAD "X: \ Program Files \ a.ini"; and if it is a variable reference and on the surface appears to be continuous, without quotes, such as:
LOAD% Program% \ a.ini // quotation marks omitted; see LOADrem.
▲ test this script commands in the command line PECMDEDIT or PECMD; do CMD command line.
▲ command word subject: AZ az 0-9 _ characters. The "$ # @ + - | ^ &" suffix are all start flag. FIND-JPG and THREAD * FIND-JPG
The syntax is illegal, but you can use CALL FIND-JPG and complete manner THREAD * CALL FIND-JPG's.
▲ EXEC * 1 command ... NAME = command line receive information immediately terminate execution
▲ try to use less variable PE environment variables, so that you can continue to use the functions in a multithreaded environment. & CurDir ... & ERRORLEVEL user variables.
△ when executing a command in the CMD window or PECMD WinGUI program, with a pair of the percent "% Desktop%" to use the built-in environment variables PECMD.
△ PECMD execute command in the CMD batch file, use a double for the percent sign "%% Desktop %%" PECMD use the built-in environment variables.
△ If you use the command line, and the para with the ">" or "|" or "&" or "^", the para command must be surrounded by quotation marks, otherwise it will be considered
is to redirect or pipe operator and so on. Or in front of these characters plus a "^." The program supports quotes para resolution.
◎ Note: The lower the value of the local variables can be referenced directly superior local variables, but not recommended for a global variable, because it is easy to cause the logical structure of confusion!
◇ indicate% instead of variables %% identity; built-in random number variable% RANDOM%;% PECMDVER%; real-time in the current directory:% _ CD%; current PID:% & __ PID%
◇ path variable Syntax Standard: drive: \% path variable% \% variable% path, the command does not automatically add ":" and "\", please note!
◇ Command Syntax Standard 1: ABCD [partition], [drive letter], [waiting time] // para empty can not ignore the comma between para!
◇ Command Syntax Standard 2: ABCD [partition] [, drive letter] [waiting time] // para empty reverse can also be ignored para comma before!
☆ except in special circumstances, please do not nest with a single line command statement as written, you should use the standard wording branches, so easy to read and understand.
▲ PECMD.exe exit code of the last command error code. 0 for error. Negative (or> 0x7FFFFFFF) was one.
▲ finishing top of the letter of the command to put PECMD.INI.
Соответственно и описание команд у нее на родном языке автора , то бишь на китайском. В этой теме выкладывается перевод описания команд на русском.-

Небольшой мануальчик по перепаковке PECMD.exe (версия PECMD2012.1.88.05.85Stable-210622) для своих нужд

Имя расшифровывается как стабильная версия 88.05.85 PECMD2012, дата сборки 21-06-22 (год-месяц-дата).
Во-первых, какую версию можно использовать (их в наборе несколько). Я могу обратить ваше внимание на 3 варианта:
1. Имя PECMD.EXE - это стандартная версия, упакована mpress. Если вы собираетесь "ковырять" внутренности, не особо подходит (хотя Restorator без проблем извлекает/добавляет ресурсы).
2. Имя PECMD原始.EXE - это стандартная неупакованная версия (раза в полтора больше PECMD.EXE), рекомендуется для использования в WinPE. Легко редактируется, потом (при желании) её можно упаковать mpress или UPX.
3. Специальная версия PECMD.EXE, находится в папке 免杀版. В этой версии убраны две функции: перезагрузка/выключение ПК из меню "Пуск" и запуск призрачного процесса. Эти функции вызывают больше всего ложных срабатываний антивирусов, поэтому именно эту версию следует использовать как базовую для утилит (и не стоит использовать её как основу в WinPE).
*** Версии х64 находятся в подкаталогах х64 и полностью соответствуют описаниям соответствующих х86-версий. Для WinPE х64 рекомендуется использовать именно их как более рационально использующих память (а при отсутствии подсистемы х86 других вариантов и нет).
Для редактирования нам понадобится редактор ресурсов (Restorator, Resource Hacker, Resource Tuner). Открываем exe-шник в редакторе, видим такие ресурсы:
1. EXEDATA. В нем единственная пустышка. Ресурс предназначен для интеграции консольных утилит с возможностью запуска из скриптов. Обращение к ресурсам #10|EXE (где 10 - номер ресурса), допустим также синтаксис #10:EXE (для исключения проблем с TEAM)
2. INDATA. Обращение к ресурсам #100, или #100|INDATA, или #100:INDATA (где 100 - номер ресурса). Далее: * означает упаковку командой CMPS без шифрования, а ** - с шифрованием (не распаковываются)
2* - BARTPE.exe, утилита используется в WinPE на базе 2003/ХР (для 7...11 не нужна, можно удалять)
5*,6*,7* - загрузочные записи FAT (если вы не собираетесь их устанавливать из PECMD, удаляем)
8*,9 - загрузочные записи NTFS (если вы не собираетесь их устанавливать из PECMD, удаляем)
10* - какая-то утилита для MBROS
20* - скрипт обработки событий: если происходит какое-то событие (например, событие с кодом 0x8000 - подключение, а с кодом 0x8004 - извлечение накопителя), PECMD вызывает этот скрипт с передачей кода события (изначально - чтобы присвоить букву(ы) подключеному устройству); теоретически в этой части можно реализовать собственную процедуру безопасного извлечения флешки; а практически - можно автоматизировать некоторые действия, производимые при подключении/отключении накопителей (поиск программного пакета, монтирование невидимых разделов флешки); для обычного использования в WinPE можно удалять (современные РЕ сами отлично присваивают буквы).
21** - скрипт менеджера дисков (вызывается командой PART -gui); вряд ли он вам пригодится (на китайском)
22** - неизвестно
23* - скрипт непонятного назначения
24* - какая-то собственная утилита PECMD
25 - три буквы (но не те, что вы подумали), зачем - загадка)
26** - скрипт менеджера процессов (вызывается командой KILL -gui); вряд ли он вам пригодится (на китайском)
27** - скрипт калькулятора (вызывается командой CALC -gui); вряд ли он вам пригодится (на китайском)
28** - неизвестно
29 - инсталятор ImDiskCAB-архиве) v2.0.9.64
30** - скрипт виртуальной клавиатуры (English/Chinese).
31** - скрипт сохранения скриншотов
32** - непонятный скрипт (большое окно)
33* - библиотека для распаковки CAB-архивов
34 - скрипт непонятного назначения
35** - неизвестно
36* - библиотека непонятного назначения
*** как видно и описания, можно удалять практически всё (кроме некоторых случаев, например, оставляем "2" для WinPE на базе 2003/ХР)
3. SCRIPT. В разделе заготовки-пустышки для скриптов. Если нужно интегрировать скрипт внутрь exe-шника, добавляем текст скрипта в 101. После этого при запуске exe-шника без параметров встроенный скрипт будет запущен автоматически. Другие встроенные скрипты (102, 103, 201, 202, 203,) можно вызвать как из 101, так и извне (командой LOAD #202:SCRIPT, например).
4. SCRIPTINIT. Скрипт инициализации. Загадка. Будет выполнен, если отсутствует #101:SCRIPT.
5. TAGDATA. Данные PECMD2012-LOAD-DEL PECMD2012-LOAD-MAP, на работоспособность PECMD не влияют.
6. Меню. Это трей-меню при запуске PECMD в качестве оболочки (если в PECMD.ini указана команда INIT с ключом "I"). Разноцветный значок в трее, на котором по ПКМ можно вызвать это меню. В это меню можно добавить свои утилиты (только CMD/EXE). Также, при определённом порядке нумерации пунктов, PECMD может сам добавлять в это меню реально поддерживаемые режимы разрешения (с описанием на китайском).
Остановлюсь на этом моменте немного подробнее. Как я уже писал, основное первичное назначение PECMD - это использование его под WinPE для упрощения написания сценария запуска РЕ. При этом PECMD может выполнять функции оболочки (если его запустить со скриптом командой PECMD MAIN MyStart.ini). В таком режиме он позволяет инициализировать систему, загрузить необходимые драйвера, создать РАМ-диск нужного размера, подключить FBWF (фильтр, позволяющий производить запись на незаписываемые устройства /перенаправляет изменения в память/) и т.д., и т.п. Заканчивается всё загрузкой графической оболочки (MS Explorer, BS-Explorer, ...). Преимущества такого использования в том, что мы можем неоднократно перезапускать графическую оболочку при необходимости - и при этом система продолжит работу.
7. Диалог. Ресурс 302 определяет вид главного окна PECMD при запуске без параметров (в оригинале - справка по утилите). 10011-10013, 10019, 10023 - не знаю, что за окна. 10016 - вид окон запросов (Yes/No/OK/Cancel/...). Рекомендуется заменить названия на английские, немного уменьшить высоту кнопок и поднять их чуть выше (в оригинале кнопки снизу касаются нижнего края окна запроса - некрасиво это)... или увеличить высоту окна. Также обязательно меняем шрифты на какой-то ходовой: в оригинале строка 'FONT 9, "??"', меняем её на 'FONT 9, "Tahoma"'. Если оставить как в оригинале, в окнах будет использоваться жирный шрифт (определяемый автоподменой китайского).
8. Строковая таблица. В самом начале находится 4 пункта настройки используемых программой шрифтов (1001-1004). 1001 задает шрифт окна, 1004 может изменить шрифт сообщений MESS. По-умолчанию стоит какой-то китайский шрифт (9:??), "растягивающий" русский текст. Лучше его заменить на ходовой 10:Tahoma (также неплохие результаты получаются при использовании 12:Arial Narrow, 11:Arial Unicode MS, 11:Lucida, 11:Segoe Condensed). Остальное (10001-10025) относится исключительно к РЕ (перетасовка буквы флешки - привязка её к букве U). Рекомендую вообще удалить 10001-10025.
9. RCData. Тут находится единственный ресурс, китайская справка по командам (упакована CMPS), вызываемая при запуске PECMD без параметров. Удаляем.
10. Иконка. Тут находятся иконки. Уточню, что их можно использовать в скриптах (иконка графического меню, иконки всплывающего в трее сообщения). Например, указываем вместо имени иконки PECMD.EXE#3
11. Версия. Тут указывается версия PECMD, при создании своих утилит можно указать свои данные. Уточню, что даже для файла с изменёнными данными в этом разделе можно получить реальную версию PECMD. Она может быть выведена как значение переменной &PECMDVER (номер версии PECMD - например: 201201880582) или версии сборки - переменной &PECMDBUILD (номер сборки PECMD, например: X86 U 2018-01-48).
12. Manifest. Раздел, определяющий права работы программы. По-умолчанию PECMD работает от имени пользователя, но, подправив манифест, можно заставить его работать от имени администратора: тогда при запуске, при необходимости, будет запрошен пароль - но все утилиты, запущенные из такого PECMD, будут работать от имени админа.

Чтобы без проблем посещать wuyou.net (где, в частности, есть и тема PECMD)

Пропишите в hosts (C:\Windows\System32\drivers\etc\hosts) следующее:
117.25.130.178 bbs.wuyou.net
117.25.130.178 wuyou.net
--------------------------------------------------------------------------------------------
PECMD (версия 2017-11-30) с русской справкой (машинный перевод), от avalat.
Английские сборки PECMD
Китайский форум, на котором обсуждают PECMD
Авторские (китайские) сборки PECMD
Вложение

Перепаковка PECMD.EXE (220125) x86/x64 (Utility & WinPE)

Вложение

Перепаковка PECMD.EXE (210622) x86/x64 (Utility & WinPE)

Вложение

Русская справка по командам в chm-формате (на базе перевода 210622) от avalat

Вложение

Переведённые на русский TXT-справки по всем командам PECMD (на базе оригинальной справки из 210622)



Последний раз редактировалось: korsak7 (2015-01-07 19:09), всего редактировалось 4 раз(а)

[Цитировать]

    Гость
  • Репутация:0

    [+] [-]

PECMD - общие принципы работы и ограничения

PECMD - интерпретатор команд (аналог cmd.exe, да и базируется он на том же cmd). Готовый скрипт (принято использовать расширение ini, хотя явных ограничений по расширению нет) запускается так: Pecmd.exe LOAD MyScript.ini (в версии 2012 можно даже так: Pecmd.exe MyScript.ini). Кроме команды LOAD, можно загрузить скрипт командой MAIN - этот режим нужно использовать только под WinPE (когда PECMD используется в качестве оболочки, по окончанию работы скрипта, запущенного через MAIN, выход из PECMD не производится). Готовый скрипт можно интегрировать в PECMD и использовать результат как обычную exe-шку.
Символы комментирования, которые можно использовать в скриптах: "//" или "`". Все, что находится после этих символов, игнорируется интерпретатором (до конца строки). Можно использовать для комментариев: как в начале строки, так и после команд(ы).
Если запустить PECMD без параметров, запустится окно программы со справкой (увы, на китайском... хорошо хоть в Unicode).
Команды нечуствительны к регистру букв, т.е LOAD или load будет исполнятся одинаково.
<параметры, заключенные в эти символы> - обязательны (кроме случаев, когда имеется значение по-умолчанию - тогда параметр можно упустить)
[то, что находится в этих скобках] - необязательные параметры (реализация дополнительного функционала), могут быть упущены
Имена файлов или пути можно использовать без "" - даже при наличии в них пробелов или нелатинских букв они обрабатываются правильно. Т.е., можно указать путь так: "C:\Моя папка\мой файл.txt", а можно и просто C:\Моя папка\мой файл.txt
Скрипты должны быть в кодировке TXT-ANSI, русские буквы поддерживаются (после замены вызываемого в программе шрифта на русский, иначе отображаются растянуто).
Запускать можно не только готовые скрипты, но и отдельные команды. Например: PECMD MESS Недостаточно физической памяти \n подключить файл подкачки @ Подключить файл подкачки #YN * 10000 $ N
Можно использовать стандартные системные переменные, например, %Desktop% или %Windir%
Если нужно запустить из-под PECMD обычный CMD-файл с использованием в качестве ключей переменных, их нужно указывать в двойных %%, т.е, %%Desktop%% или %%Windir%%. Если при запуске CMD-файла или командной строки нужно использовать символы >, |, &, ^,- то их нужно заключать в кавычки: ">", "|", "&", "^".
В программе доступны внутренние переменные: %_CD% - текущий каталог, %PECMDVER% - версия программы, %RANDOM% - случайное число
После выхода из программы в %ErrorLevel% хранится код ошибки последней команды, или "0" - если выход без ошибки.
Некоторые из команд (например, TIPS - всплывающее сообщение в трее) выполняются только до момента завершения работы интерпретатора. Например, мы задали время отображения информации в трее 10сек., но через 3сек. произошел выход из PECMD. Тогда и сообщение будет погашено через 3сек. Т.е., такие моменты нужно учитывать.
Ограничения: поскольку в командах PECMD в качестве разделителя используются некоторые символы (например, обычная запятая ","), то при использовании этих же символов в теле переменных нужно быть аккуратными, иначе "," в переменной может оказаться разделителем нашей команды - и, соответственно, она будет работать неправильно.
Начну, пожалуй, с самой затребованной при создании скриптов или отладке команды MESS

MESS - вывод сообщения в отдельном окне

Format: MESS [Текст в окне] [@Название окна] [#Кнопка окна] [*Время автозакрытия (в миллисекундах)] [$выбор по-умолчанию]
Function: Отобразить запрос с кнопками подтверждения/отмены в отдельном окне
Parameters:
■ Текст в окне может быть мультистроковым, для разделения строк используется "\n". Можно использовать переменные (%rat%).
■ Название окна - одна строчка. Можно использовать переменные (%rat%).
■ Кнопка окна. Поддерживаются варианты: "YN" (Да/Нет), "OK" (ОК), "YNC" (Да/Нет/Отмена), "OKC" (ОК/Отмена), "RETRY" (Повторить), "ABORT" (Прервать). По-умолчанию (если не указано) установлено OK (подтверждение). Результат нажатия можно получить в переменной $%YESNO% (YES, NO, OK, CANCEL, RETRY и т.д.) после закрытия окна или истечения времени автозакрытия.
■ Если время автозакрытия установлено 0 или не указано, окно не закроется автоматически.
■ MESS* предназначено для параллельного вызова. Т.е., основное окно не блокируются и с ним можно продолжать работать. Выполнение комманд до закрытия окна сообщения блокируется.
■ MESS- предназначено фоновой работы окна. Основное окно не блокируется, можно выполнять команды. Режим хорошо подходит для отладки скрипта.
■ MESS= полностью блокирует работу основного окна. Можно использовать для специальной отладки скрипта.
■ MESS блокирует работу основного окна, но не блокирует весь цикл обработки сообщений.
Example:
◆ MESS Недостаточно физической памяти \n подключить файл подкачки @ Подключить файл подкачки #YN * 10000 $ N
Remarks:
※ Команду можно использовать как в готовом скрипте, так и при запуске из комстроки, т.е., запустить так:
PECMD.EXE MESS Недостаточно памяти! @ Подключить файл подкачки #YN *10000 $ N

LPOS - поиск заданного символа в строке (с начала строки)

Format: LPOS [ *] [ *] [-case] <имя переменной> <=> <символ>, <число>, <строка>
Function: Функция возвращает порядковый номер N-ного (<число>) символа (<символ>) в исходной последовательности (<строка>). Отсчет от начала последовательности.
Parameters:
■ <имя переменной> имя переменной для сохранения результата, [-case] для различения регистра букв (т.е, различать "а" и "А")
■ <символ> символ или набор символов для поиска
■ <число> какой по порядку символ (или набор символов) искать (1 - первый, 3 - третий). По-умолчанию (если упущено) - 1.
■ <строка> исходная последовательность символов
■ LPOS *: найти начало подстроки, заключенной между "=" и ","; в качестве подстоки может быть любой символ, пробел или группа символов.
■ LPOS **: похоже на LPOS *, но возвращает порядок слова в строке
■ LPOS ***: похоже на LPOS **, но позволяет использовать -qu для совместимости с MSTR, $ вместо "пробела", # вместо TAB, или элементы, указанные в -delims:(\n\r\t\v\f\b)
Example:
◆ LPOS iPos=a,2,123A56R1234A6Uabcdef //Результатом будет 12 (%iPos%) - т.е., порядковый номер второй буквы "A"
◆ LPOS iPos=|,1,123A56|1234A6|abcdef //Результатом будет 7 (%iPos%) - т.е., порядковый номер первого встеченного символа "|"
◆ LPOS* P2=B B,,AA EE B B DD //Поиск начала подстроки B B в исходной строке AA EE B B DD. Результат P2=7 (т.е., искомая фраза начинается с седьмого символа).
◆ LPOS*** P2="BB FF 199",,AA XX EE "BB FF 199" DD //Поиск фразы "BB FF 199" в исходной строке AA XX EE "BB FF 199". Результат P2=4 (т.е., искомая фраза в кавычках - это четвертое "слово")

RPOS - поиск заданного символа в строке (с конца строки)

Format: RPOS [-case] <имя переменной> <=> <символ>, <число>, <строка>
Function: Функция возвращает порядковый номер N-ного (<число>) символа (<символ>) в исходной последовательности (<строка>). Отсчет от конца последовательности.
Parameters:
■ <имя переменной> имя переменной для сохранения результата, [-case] для различения регистра букв (т.е, различать "а" и "А")
■ <символ> символ или набор символов для поиска
■ <число> какой по порядку символ (или набор символов) искать (1 - первый, 3 - третий). По-умолчанию (если упущено) - 1.
■ <строка> исходная последовательность символов
Example:
◆ RPOS -case iPos=А,2,Аба-ба-Га-лА-Ма-Га //Результатом будет 1 (iPos=1) - т.е., позиция второй буквы "А", если искать её (с учётом регистра -case) с конца. Без учета регистра можно искать только английские буквы (для русских букв правильно не работает - русские "А" и "а" для PECMD - это не одна и та же буква).
◆ RPOS iPos=p,3,Happy Birthday Puhpol //Результатом будет 4 - это позиция 3-й буквы "p", если искать с конца последовательности.

LSTR - перехват указанного количества символов из заданной последовательности (с начала строки)

Format: LSTR
  • <имя переменной> <=> <число>, <строка>
    Function: Функция для перехвата указанного количества символов из заданной последовательности слева, возвращает результаты в указанном имени переменной.
    Parameters:
    ■ <имя переменной> имя переменной, в которой будет сохранен результат
    ■ <число> определяет количество символов перехвата
    ■ <строка> входные данные для обработки, ограничение
    Example:
    ◆ LSTR AStr=2,1234567890 //Результатом будет 12, т.е., 2 первых символа
    ◆ LSTR AStr=5,ABCDEFGH13 //Результатом будет ABCDE, т.е., 5 первых символов
    Remarks:
    Если <число> меньше 1 либо превышает длину исходной строки, результатом будет вся исходная строка (эквивалент копирования)
  • RSTR - перехват указанного количества символов из заданной последовательности (с конца строки)

    Format: RSTR
  • <имя переменной> <=> <число>, <строка>
    Function: Функция для перехвата указанного количества символов из заданной последовательности с конца строки, возвращает результаты в указанном имени переменной.
    Parameters:
    ■ <имя переменной> имя переменной, в которой будет сохранен результат
    ■ <число> определяет количество символов перехвата
    ■ <строка> входные данные для обработки, ограничение
    Example:
    ◆ RSTR AStr=2,1234567890 //Результатом будет 90, т.е., 2 последних символа
    ◆ RSTR AStr=5,ABCDEFGH13 //Результатом будет FGH13, т.е., 5 последних символов
    Remarks:
    Если <число> меньше 1 либо превышает длину исходной строки, результатом будет вся исходная строка (эквивалент копирования)
  • CALC - арифметические операции с числами

    Format: CALC [-base=2|8|10|16|N] [#] <Переменная> <=> <Выражение> [#[#][десятичное][E|F|G]]
    Function: Команда производит арифметические операции, результат заносится в переменную. E - для научной работы, F - десятичная форма, G - автоматически использовать относительно простой способ.
    Parameters:
    ■ -base=2|8|10|16|N в каком формате обрабатывать результат. Результат будет: в двоичном 0bNNNN, 8-ном 0oNNNN, 10-ном (непосредственно число), или 16-ном 0xNNNN форматах.
    ■ N используется для нестандартных НЕХ. Также применяется для операций с плавающей запятой (округленно).
    ■ префикс (лидирующий символ) "#" указывает, что все переменные обрабатываются как int64 тип данных, если "#" лидирующий упущен - тогда double-data handling
    ■ <Выражение> - это конкретное значение (либо существующая переменная), поддерживаются научные обозначения.
    ■ символы поддерживаемых операций: > (равно), >= (больше или равно), < (меньше), <= (меньше или равно), <> (не равно), "|" (логическое "И"), "&" (логическая конюнкция), "@" (исключающее "ИЛИ"), "+" (плюс), "-" (минус), "*" (умножить), "/" (разделить); "%" (процент), "^" (степень).
    ■ скобки () [] {} задают уровень приоритета. Данные с плавающей запятой поддерживают TGMKS-суффикс. K=1024 S=512
    ■ поддерживаются математические константы: e (иррациональная константа натурального логарифма 2,718281828), pi (3.14159...), в общей сложности двух математических констант.
    ■ постфикс "#" указывает количеством знаков после запятой для сохранения, максимум 16
    ■ если результат операции нечисловой, он заменяется "0". "#" в сочетании с "#" сохраняет выше 0.
    ■ поддерживаются математические функции abs(a), arccos(a), arcctg(a), arcsin(a), arctan(a), ceil(a), cos(a), ctg(a), deg(a), div(a,b), exp(a), frac(a), floor(a), hypot(a,b), int(a), lg(a), ln(a), log(a,b), max(a,b), min(a,b), mod(a,b), pow(a,b), pow10(a), rad(a), rand(a), round(a), shl(a,b), shr(a,b), sin(a), sqrt(a), tan(a), xor(a,b), not(a) [可~a], lnot(a) [可!a]
    Example:
    ◆ CALC #Sum=128+32*22 // Результатом будет Sum=832
    ◆ CALC #Sum=128^2 // 128 в квадрате Sum=16384
    ◆ CALC Sum=[1+2]*7/((3-{1+1})*2) // Результатом будет 10,5 (3*7/2), скобки могут быть () [] {}
    ◆ CALC #Sum=%RANDOM% % 1000 // Генерация случайных чисел в диапазоне 0-999
    Remarks:
    ※ данные для обработки могут быть присвоены через ENVI либо быть результатом предыдущей операции или команды
    ※ для сравнения чисел также можно использовать IFEX (IFEX %Num2%>%Num1%,ENVI MIN=%Num1%)
    ※ данные больше чем 16 в 10-й степени не различаются (± 9007199254740991)
    ※ для генерации случайных чисел можно использовать %RANDOM%, можно указать диапазон для генерации.
    -

    Демонстрация вывода сообщений в утилите (создайте в блокноте файл demo.ini, и внесите в него текст). Запускать pecmd.exe demo.ini

    MESS Первое сообщение\nв отдельном окне\nс таймингом и Y/N @ #YN *10000
    MESS Второе сообщение\nв отдельном окне\nбез тайминга @ #OK
    TIPS Внимание!,\nВот такое\nсообщение\nв трее!!!\n ,5000,1,pecmd.exe#0 `\n - перенос текста на след.строку, ,5000 - время отображения (мс), pecmd.exe#0 - иконка 0 из файла pecmd.exe
    WAIT 5000 `Подождать 5 секунд
    TEXT И ещё можно вот так показать... #0x5555FF L200 T400 R1023 B764 $64* `Где #0x5555FF - цвет, L/T/R/B - позиция текста (слева/сверху/справа/низ), $64 - размер шрифта
    WAIT 5000 `Подождать 5 секунд
    TEXT `Погасить текст на экране

    Простенькое окно с выбором (после нажатия на кнопку выполнение в скрытом режиме с ожиданием батника)

    CALL @Windows1
    _SUB Windows1,W800H220,Выбор операционной системы,,
    ENVI @this.Font=40:Tahoma
    LABE Text1,L10T20W770H50,Какой Windows необходимо установить?,,0x000088,36
    LABE Text2,L350T95W90H50,или,,,40
    ITEM Win7,L40T90W290H70,Windows 7,EXEC =!win7_setup.cmd,,
    ITEM Win8,L460T90W290H70,Windows 8,EXEC =!win8_setup.cmd,,
    _END

    Довольно сложный скрипт - просмотр иконок в выбранной библиотеке (или exe-файле) с индикацией номера

    Скрипт интересен именно практическим применением для разработчиков РЕ-сборок и тех, кто пишет скрипты для PECMD. Ведь вместо того, чтобы добавлять "свою" иконку (например, для ярлычка или окна скрипта PECMD), подчас можно использовать готовые иконки из набора той же винды. Благо иконок в системных файлах много... Нужно только найти подходящую и определить её номер. Скачать скрипт можно под этим сообщением.

    А это скрипт для получения технических характеристик компа

    В этом скрипте собрано самые актуальные технические сведения о ПК: загрузка процессора, объём свободной и доступной ОЗУ, имя ОС/РЕ, название процессора и его частота, выбор раздела (только Fixed-type, т.е., флешки в него не попадут) с информацией о свободном и полном размере и меткой диска, получение развернутой инфы о выбранном разделе. При этом инфа об объёме свободной памяти и загрузке процессора обновляется каждые 500мс (информацию о свободном размере разделов, по большому счёту, тоже желательно было бы обновлять... но не хочется терзать каждые полсекунды накопители). Скачать скрипт можно под этим сообщением.
    Те, кто захочет покопаться в скрипте, обратите внимание, как легко и просто получается информация о памяти:
    TEAM IFEX MEM=?,FreeR|MESS %FreeR% Mb
    TEAM FIND MEM=?,FullR|MESS %FullR% Mb

    Точно также легко получить размер раздела в байтах (доступный или полный):
    FIND %CurDrv%\=?,FullS|MESS %CurDrv% : free %FullS% bytes
    IFEX %CurDrv%\=?,FreeS|MESS %CurDrv% : full %FreeS% bytes

    Да и получение данных из реестра - тоже сказка: нужно знать только ключ, нужное имя и тип записи
    REGI $HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString,CurCP
    Прикрепил свой мини-Help с вариантами применения команд (он не делался для публики, но, думаю, пригодится желающим написать скрипт).
    Вложение

    Скрипт получения технических характеристик

    Вложение

    Скрипт просмотра иконок

    Вложение

    Текстовый файл с примерами команд (коментарий отделен тильдой `)



    Последний раз редактировалось: Гость (2021-08-19 09:46), всего редактировалось 28 раз(а)

    [Цитировать]

      Sergey.del
    • 7
    • Стаж: 9 лет 4 месяца
    • Сообщений: 60
    • Репутация:4

      [+] [-]
    • Откуда: Новороссийск, Россия
    1. Отсюда https://yadi.sk/d/hRChOI_edq4cF тащите файл help_2_command.txt (кодировка UTF-8)
    Поправьте, пожалуйста, ссылку, а то получилось так:
    "http://https//yadi.sk/d/hRChOI_edq4cF"
    Кстати, взгляните сюда Detailed Explanation of PECMD in WinPE—-PECMD.INI File Configuration
    Это оно?

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    Sergey.del, да, частично оно. Но, во-первых - для старой версии (4.0.0501) с более скромными возможностями (по сравнению с новыми версиями 2012). Во-вторых, там упущены некоторые команды даже для неё (например, не упоминается о командах READ, WRIT - это команды для чтения/записи файла). В новых версиях возможности обработки значительно расширены. И, хотя "старый" синтаксис обычно работает, без правки "старых" скриптов порой не обойтись.

    Несколько примеров использования команд в PECMD для старой версии

    BROW File, C:\Install*.Wim;Install*.Esd;Install*.Swm, Выберите файл wim/esd/swm., WIM/ESD/SWM `Открыть диалог выбора файла (с маской Install*.Wim/Esd/Swm). После выбора в переменной %File% будет полный путь к файлу. Начать с корня диска С:\
    BROW Folder, *C:\, Выберите папку, `Открыть диалог выбора папки. После выбора в переменной %Folder% будет полный путь к папке. *** В сильно урезанных РЕ может не работать окно отображения каталогов, выбор будет невозможен!
    CALL $SHELL32.DLL,DllInstall,#1,U `Вызвать библиотеку
    CALL ASK `Вызов подпрограммы (начинается с _SUB ASK ... заканчивается _END)
    DEVI %WinDir%\inf\net*.inf `Установить все net*.inf устройства из папки %WinDir%\inf
    DFMT E: FAT32,RamDisk,2048,1 `Форматировать диск E: под FAT32 с меткой диска RamDisk, размером кластера 2048 байт и со сжатием.
    DFMT R: NTFS,Disk `Форматировать диск R: под NTFS с меткой Disk, стандартным размером кластера (512 байт) и без сжатия.
    DISP W1024 H768 B32 `Разрешение экрана 1024х768, 32бита
    ENVI $Desktop=X:\Documents and Settings\Default User\Рабочий стол `Присвоить системную переменную Desktop
    ENVI OPDir=Y:\TOOLS `Присвоить переменную
    EXEC !CMD.EXE /C "ECHO.>%WinDir%\CHM.OK" `В комстроке запустить (без ожидания, в скрытом режиме) CMD.EXE и с его помощью создать пустой файл %WinDir%\CHM.OK
    EXEC @ATTRIB +H "%USERPROFILE%\Default User\Рабочий стол" `Установить атрибут "скрытый" для папки "Рабочий стол"
    EXEC =!CMD.EXE /C "REGSVR32 /S X:\i386\SYSTEM32\SEND.DLL" `Выполнить ("=" ждать отработки, "!" в скрытом окне)
    FDIR pathr=%full% `Получить путь к файлу из полного пути (т.е., получить из имени всё до последнего "\")
    FEXT ext=%full% `Получить расширение файла из полного пути или имени (т.е., получить из имени всё после последней ".")
    FILE %WS%\SMSS.EXE `Удалить файл (или папку FILE X:\TEMP)
    FILE .\PE3\filepaths.txt=>%AppData% `Скопировать .\PE3\filepaths.txt в %AppData% (если нужно перенести, тогда "=>" меняем на ">>")
    FILE X:\i386\TEMP\*.* `Удалить все файлы в %Темр%
    FIND KEY=#112,ENVI NETyes=ok!ENVI NETyes=No `Проверяем нажатие кнопки с кодом #112 (F1), если нажата - присваиваем NETyes=ok, иначе - NETyes=No
    FIND MEM<384,FBWF P40 L96 H192!FBWF P50 L160 H256 `Если общей памяти меньше 384, запускаем FBWF с параметрами P40 L96 H192, иначе - с другими
    FIND NOTEPAD.EXE,MESS NOTEPAD @ #YN *10000 `Если запущен блокнот, вывести сообщение NOTEPAD
    FORX %CURDIR%\VMWAREUSER.EXE,VM,1,TEAM EXEC %VM%
    FORX %WinDir%\System32\*.ocx,Regocx,0,CALL $%Regocx% `Искать все ocx в сис.каталоге и зарегистрировать их
    FORX *.exe,File,0,CALL SS `Искать все exe-файлы в текущем каталоге, их имя в переменной %File% передается на обработку подпрограмме SS
    FORX @*,Folder,0,CALL SS `Искать все папки в текущем каталоге, их имя в переменной %Folder% передается на обработку подпрограмме SS
    GETF B:\1.ini,0x0#0x10,FileData `Получить в переменную %FileData% HEX-значение с 0x0-го по 0x10 (либо в десятичном - GETF B:\1.ini,0#16,FileData)
    GETF C:\pagefile.sys,-1,FileLength `Получить в переменную %FileLength% размер файла C:\pagefile.sys в байтах
    HASH %SystemRoot%\System32\UserInit.EXE,UserInit,Md5 `Подсчет контрольной суммы файла MD5 (CRC32, SHA1, SHA256)
    HIVE BCD,F:\BOOT\BCD `Скрыть файл BCD (присвоить аттрибут "скрытый")
    HOTK Ctrl+Shift+#0x31,!resolution.cmd 800 600 `Назначить горячую клавишу Ctrl+Shift+1. Если будет задействована эта комбинация, то произойдёт запуск батника resolution.cmd с параметрами 800 600
    IFEX MEM>1500,ENVI DT=%SystemRoot%\TEMP!ENVI DT=C:\DRVTEMP `Если памяти > 1500Мб, назначить переменную, иначе другое значение
    IFEX PECMD2TMP.EXE, WAIT 1500 `Если запущена программа PECMD2TMP.EXE, ждать 1500мс
    IMAG Image1,L8T380W140H70,%CurDir%\logo.gif,EXEC %CurDir%\Setup.EXE,#0xFF00FF,2 `Картинка %CurDir%\logo.gif указанного размера, при нажатии запуск %CurDir%\Setup.EXE
    INIT IU `Показать значок PECMD в трее / INIT U - не показывать
    KILL SMSS.EXE `Убить процесс
    LINK !%Desktop%\RASPPPOE,RASPPPOE.CMD,,RASDIAL.DLL#19 `Создать ярлык на раб.стол с иконкой 19 из библиотеки RASDIAL.DLL
    LINK %Programs%\Стандартные\Блокнот,%WS%\NOTEPAD.EXE `Создать ярлык блокнота
    LOAD %WS%\WXRS.INI `Загрузить и выполнить скрипт %WS%\WXRS.INI
    LOGO %WS%\LOGO2.JPG `Логотип загрузки (сразу после запуска РЕ, до загрузки рабочего стола)
    LOGS %W%\PECMD.LOG `Записать логи PECMD (для отладки скриптов)
    MESS Clear Complete!@Clear Temp #ok *1000 Сообщение об очистке
    MESS Memory is low\n \setting yes in 5 seconds #YN *5000 $Y `Сообщение с запросом (Да/Нет) / FIND $%YESNO%=YES,CALL PAGEFILSET
    MESS Папка C:\Windows имеется!\nНажмите [OK] для выхода.`Сообщение с подтверждением.
    MOUN X:\WXPE\SYSTEM32\TOOLS.WIM,Y:\TOOLS\,1,%TEMP% `Монтирование WIM в папку Y:\TOOLS\, монтируется раздел 1 архива. Для записи текущих изменений используется %TEMP%
    NAME name=%full% `Получить имя файла %name% (без расширения!) из полного пути %full%. Будет получено имя от последнего "\" до первой "." после него.
    NUMK 1 `Включить NumLock (NUMK 0 - выключить)
    PAGE %DRIVE%\Pagefile.sys 512 1024 `Подключить файл подкачки %DRIVE%\Pagefile.sys с минимальным размером 512Мб и максимальным 1024Мб
    PATH %PT%\TempPath `Создать каталог %PT%\TempPath
    PATH @%path% `Установить путь (@ - означает относительно текущего каталога)
    PINT %SystemRoot%\system32\devmgmt.msc `Добавление в меню "Пуск"
    PINT %SystemRoot%\system32\notepad.exe,Taskband `Добавление в таскбар (только 7/8)
    PUTF %CurDir%\Memu.DAT,0x400,0x23 0xAD 0x1C 0x80 0x6F `Изменяет бинарные данные в указанном файле.
    RADI RadioButton1,L32T314W100H20,WimShExt.DLL,ENVI @Group1=%RadioButton1%,1,1 `Радиокнопка (т.е., группа чекбоксов, для которых можно выбрать только одну из группы)
    RAMD ImDisk,L64,NTFS,B: `Создать RAM-диск В:\ на 64Мб с NTFS с помощью ImDisk
    READ %CurDir%\Memu.LST,-1,LastLine `Чтение из файла последней строки
    READ %CurDir%\Memu.LST,10,CurLine `Чтение из файла 10-й строки
    REGI $HKLM\System\CurrentControlSet\Control\SystemStartOptions,tp `Считать значение из SystemStartOptions и передать в переменную %tp%
    REGI HKCR\Drive\shell\ImDiskSaveImage\command\=rundll32.exe imdisk.cpl,RunDLL_SaveImageFile %L `Добавить в реестр
    REGI HKCU\Software\als\s\ff=@X `аналог reg add "HKCU\Software\als\s" /f /v "ff" /t REG_BINARY /d
    REGI HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\{7007ACC7-3202-11D1-AAD2-00805FC1270E}\! `Удалить ветку реестра
    RUNS %MyName% EXEC !%CurDir%\SetIP.CMD
    SCRN ScrW,ScrH `Функция возвращает текущее разрешение экрана (присваивает его переменным ScrW,ScrH)
    SEND #0x12_,#0x09_,#0x09^,#0x12^ »т SEND #0x11_,A_,A^,#0x11^ `Послать код нажатой кнопки (т.е., имитировать нажатие кнопки)
    SEND #121 `Имитировать нажатие кнопки #121
    SERV !AudioSrv `Запустить сервис
    SERV FBWF `Операции с сервисами
    SITE %USERPROFILE%\SRNPE\SRNPE\Start Menu\programs,+H+R `Установить атрибуты (+A - archive, +H - hidden, +R - readonly, +S - system)
    SIZE iSize=D:\file.avi `Получить размер файла в байтах в переменную %iSize%
    STRL iLen=1234567890 `Получить длину значения или переменной
    SUBJ B:,D:\MyTools `Аналог dos-команды Subst. Позволяет смонтировать папку D:\MyTools как диск B:
    TEAM PATH %SystemDrive%\TEMP|EXEC @PECMD.EXE CALL $SHELL32.DLL,DllInstall,#1,U `TEAM - запуск группы комманд, они разделяются "|"
    TEMP @Delete очистить %TEMP% без подтверждения
    TEMP Delete очистить папку %TEMP%
    TEXT Запуск Server 2003 PE...#0xFFFFFF L415 T20 R800 B750 $20* `Вывести текст Запуск Server 2003 PE на экран, цвет текста #0xFFFFFF, в нужной позиции (L/T/R/B) с размером шрифта 20
    TIME Timer1,10000,FILE %TEMP%\*.*
    TIPS Attention!,\nThe folder is cleared!,5000,1,PeSet.exe#0 `Всплывающая в трее подсказка (5сек.), 0-я иконка PeSet.exe
    TIPS Шапка,Сообщение,50000,4,SHELL32.DLL#9 `Сообщение в трее
    USER Windows SP3 PE,2010yg `Создать пользователя
    WAIT 500 `Ждать 500мс
    WALL X:\i386\SYSTEM32\LOGO.JPG `Подключить обои X:\i386\SYSTEM32\LOGO.JPG
    WRIT B:\BOOT.INI,-1 `Удалить из файла B:\BOOT.INI первую строчку
    WRIT B:\BOOT.INI,+0,C:\AVLDR.NT6=Window_7_PE `Добавить в файл B:\BOOT.INI фразу C:\AVLDR.NT6=Window_7_PE
    ** Для комментирования записей можно использовать либо "//", либо символ "`". Всё, что находится в строке после них, не исполняется.
    Свежую стабильную версию выложил тут. Имеется также небольшая утилитка для получения кодов нажатой клавиши и выбора цвета (залил на сайт, см. ниже сообщения).
    Встроенный хелп - если просто запустить сабж. Хелп на китаяйском, но в уникоде - копируем текст и переводим в гугле. PECMD╘н╩╝.EXE - это неупакованный вариант, PECMD.EXE - упакованный (UPX), PECMDEDIT.exe - редактор с проверкой синтаксиса (увы, чинезе). В папке ╩╛└¤ - образцы скриптов.

    Скрипт 78RePack - как смог, так и описал.

    //Определяем буковку диска, на котором находится %TEMP%, присваиваем её %TDrv%
    FDRV TDrv=%TEMP%
    //Ищем файлы *.wim в папке 78repack на диске %TDrv%. Если найден файл, его имя вносим в переменную %WFil% и выполняем вызов подпрограммы PthName
    FORX %TDrv%\78repack\*.wim,WFil,0,CALL PthName
    //Если отсутствует %WFil%, ищем файлы *.esd в папке 78repack на диске %TDrv%. Если найден файл, его имя вносим в переменную %WFil% и выполняем вызов подпрограммы PthName
    IFEX %WFil%,!FORX %TDrv%\78repack\*.esd,WFil,0,CALL PthName
    //Если отсутствует %WFil%, ищем файлы *.swm в папке 78repack на диске %TDrv%. Если найден файл, его имя вносим в переменную %WFil% и выполняем вызов подпрограммы PthName
    IFEX %WFil%,!FORX %TDrv%\78repack\*.swm,WFil,0,CALL PthName
    //Если отсутствует %WFil%, устанавливаем переменные %XFil%, %PFil%, %NFil%
    IFEX %WFil%,!TEAM ENVi XFil=|ENVI PFil=|ENVI NFil=Archive is not selected by the user
    //Переход к подпрограмме @&Window4
    CALL @&Window4
    //Подпрограмма @&Window4 (рисуем окно с размерами 410х230), названием 78RePack (wim/esd/swm/rwm) и иконкой 0 из 78Setup.exe
    _SUB &Window4,W410H230,78RePack (wim/esd/swm/rwm),,78Setup.exe#0
    //Устанавливаем системные переменные %&p% и %&V%
    TEAM ENVI &p=0|ENVI &V=
    //Рисуем группу слева/сверху/ширина/высота 7/7/390/88 с названием Archive
    GROU Group1,L7T7W390H88,Archive
    //Рисуем кнопку 310/24/80/26 с именем Select. При нажатии будет вызвана подпрограмма SelArch
    ITEM Button1,L310T24W80H26,Select,CALL SelArch
    //Рисуем кнопку Info. При нажатии будет вызвана группа:запуск с ожиданием и в скрытом режиме (=!) cmd.exe, и последующий запуск (без ожидания в обычном режиме) блокнота с файлом
    ITEM Button2,L14T28W80H20,Info,TEAM EXEC =!cmd.exe /c WLImagex.exe info "%WFil%">"%NFil%.txt"|EXEC notepad %NFil%.txt,
    //Рисуем кнопку Verify...
    ITEM Button3,L108T28W80H20,Verify,CALL ArchVrf,
    //Рисуем кнопку Extract to...
    ITEM Button4,L202T28W80H20,Extract to...,CALL ArchXtr,
    //Рисуем надпись Selected:, шрифт 10
    LABE Label1,L10T56W45H13,Selected:,,,10
    //Готовим позицию для имени архива (имя будет в системной переменной %@Label2%), цвет 0x000055, шрифт 11
    LABE Label2,L58T55W336H16,,,0x000055,11
    //Рисуем надпись Folder:, шрифт 10
    LABE Label3,L22T75W46H13,Folder:,,,10
    //Готовим позицию для папки архива (имя будет в системной переменной %@Label4%), цвет 0x000055, шрифт 11
    LABE Label4,L58T74W336H16,,,0x000055,11
    //Присваиваем @Label2 имя файла, а @Label4 имя папки
    TEAM ENVI @Label2=%NFil%.%XFil%|ENVI @Label4=%PFil%
    //Рисуем группу с названием Repack
    GROU Group2,L7T100W390H88,Repack
    //Рисуем надпись conty9 @ 2015 с цветом 0xaaaaaa и шрифтом 12
    LABE Label5,L297T98W92H16, conty9 @ 2015 ,,0xaaaaaa,12
    //Делаем группу из 4-х радиокнопок (активна только одна)
    RADI RadioButton1,L14T112W154H20,Convert to WIM (Optimize),ENVI TypF=Wim,1,1
    RADI RadioButton2,L14T130W155H20,Convert to WIM (Ultra Pack),ENVI TypF=WmU,0,1
    RADI RadioButton4,L14T148W155H20,Convert to ESD (Windows 8.1),ENVI TypF=Esd,0,1
    RADI RadioButton3,L14T166W155H20,Split to SWM (1000 Mb each),ENVI TypF=Swm,0,1
    //По-умолчанию выбрана первая кнопка
    ENVI TypF=Wim
    //Рисуем прогресс-бар
    PBAR PBAR1,L170T122W220H20,0
    //Заготовка под индикацию прогресса в цифрах (+цвет/шрифт)
    LABE PBAR1_TEXT,L258T157W44H22,,,0x0000FF,16
    //Кнопка "Отмены" с групповой операцией: убить процесс WLImagex.exe, назначить переменную Brk, удалить временные файлы %WFil%*?
    ITEM Button5,L170T155W80H24,Cancel,TEAM KILL WLImagex.exe|ENVI Brk=1|FILE %WFil%*?,
    //Кнопка "Start", с вызовом нужной подпрограммы (определяется в переменной %TypF%, блок радиокнопок)
    ITEM Button6,L310T155W80H24,Start,CALL Arch%TypF%,
    //Если отсутствует %WFil%, назначаем системные переменные кнопок =0 (т.е., блокируем их активность)
    IFEX %WFil%,!TEAM ENVI @PBAR1=0|ENVI @PBAR1_TEXT=|ENVI @Button2.Enable=0|ENVI @Button3.Enable=0|ENVI @Button4.Enable=0|ENVI @Button6.Enable=0|ENVI @Button6.Enable=0|EXIT -
    //Конец. В смысле подпрограммы.
    _END
    //Подпрограмма для разборки имени на составляющие
    _SUB PthName
    //Получить в %NFil% имя файла, в %XFil% - его расширение, в %PFil% - путь к файлу
    TEAM FNAM NFil=%WFil%|FEXT XFil=%WFil%|FDIR PFil=%WFil%
    //Присвоить %@Label2% имя с расширением, а %@Label4% - путь.
    TEAM ENVI @Label2=%NFil%.%XFil%|ENVI @Label4=%PFil%\
    _END
    //Подпрограмма для диалога выбора архива
    _SUB SelArch
    //Обнулить перменную %WFl%
    ENVI WFl=
    //Открыть диалог выбора файла с маской "*.Wim;*.Esd;*.Swm;*.Rwm", названием диалога "Select wim/esd/swm/rwm file" и поддерживаемыми расширениями WIM/ESD/SWM/RWM
    BROW WFl, $\*.Wim;*.Esd;*.Swm;*.Rwm, Select wim/esd/swm/rwm file, WIM/ESD/SWM/RWM
    //Если файл выбран (имеется на диске), присвоить %WFil% полный путь к нему и вызвать подпрограмму PthName
    IFEX "%WFl%",TEAM ENVI WFil=%WFl%|CALL PthName
    //Если есть %WFil%, вызвать UnBlkOp
    IFEX %WFil%, CALL UnBlkOp
    _END
    //Подпрограмма проверки архива
    _SUB ArchVrf
    //Вызвать BlockOp (заблокировать остальные кнопки)
    CALL BlockOp
    //Запустить проверку (обычное окно с ожиданием завершения) архива "%WFil%"
    EXEC =cmd.exe /k WLImagex.exe verify "%WFil%"
    //Вызвать UnBlkOp (разблокировать остальные кнопки)
    CALL UnBlkOp
    _END
    //Подпрограмма распаковки архива
    _SUB ArchXtr
    //Выбрать папку для распаковки
    BROW DirXtr,*,Select a folder. Will create a subfolder: %NFil%.Unp,
    //Если папка выбрана (имеется), тогда создать в ней подкаталог %DirXtr%%NFil%.Unp
    IFEX %DirXtr%,PATH %DirXtr%%NFil%.Unp!EXIT -
    CALL BlockOp
    //Запустить распаковку (обычное окно с ожиданием завершения) всего архива "%WFil%" в папку "%DirXtr%%NFil%.Unp"
    EXEC =cmd.exe /k WLImagex.exe apply "%WFil%" all "%DirXtr%%NFil%.Unp"
    CALL UnBlkOp
    _END
    //Подпрограмма склейки многотомного архива
    _SUB ArcJoin
    //Запустить склейку в скрытом режиме с ожиданием. Все сообщения каждые 200мс будут передаваться подпрограмме обработки прогресса операции RpakMsg
    EXEC* --cmd::200:RpakMsg &V=!WLImagex.exe join "%PFil%\%NFil%.wim" "%PFil%\%NFil%*.swm"
    //Разблокировать кнопки (CALL UnBlkOp). Если переменная $%Brk%=1 (операция была прервана), выйти из подпрограммы
    TEAM CALL UnBlkOp|FIND $%Brk%=1,EXIT -
    //Удалить файлы %PFil%\%NFil%*.swm, изменить переменную обрабатываемого архива на %PFil%\%NFil%.wim, вызвать подпрограмму PthName
    TEAM FILE %PFil%\%NFil%*.swm|ENVI WFil=%PFil%\%NFil%.wim|CALL PthName
    _END
    //Подпрограмма перепаковки с оптимизацией
    _SUB ArchWim
    SET &p=-1
    CALL BlockOp
    //Если входной архив многотомный (swm), перейти к подпрограмме склейки, а потом выйти из подпрограммы
    FIND $%XFil%=swm,TEAM CALL ArcJoin|EXIT -
    //Перепаковка в скрытом режиме с ожиданием. Все сообщения каждые 200мс будут передаваться подпрограмме обработки прогресса операции RpakMsg
    EXEC* --cmd::200:RpakMsg &V=!WLImagex.exe optimize "%PFil%\%NFil%*.%XFil%" --recompress --compress=LZX:50 --chunk-size=32768
    TEAM CALL UnBlkOp|FIND $%Brk%=1,EXIT -
    //Изменить расширение готового файла на wim, изменить переменную обрабатываемого архива на %PFil%\%NFil%.wim, вызвать подпрограмму PthName
    TEAM FILE "%WFil%">>"%PFil%\%NFil%.wim"|ENVI WFil=%PFil%\%NFil%.wim|CALL PthName
    _END
    //Подпрограмма ультра-перепаковки
    _SUB ArchWmU
    SET &p=-1
    CALL BlockOp
    FIND $%XFil%=swm,TEAM CALL ArcJoin|EXIT -
    EXEC* --cmd::200:RpakMsg &V=!WLImagex.exe optimize "%WFil%" --recompress --compress=LZX:400 --chunk-size=32768
    TEAM CALL UnBlkOp|FIND $%Brk%=1,EXIT -
    TEAM FILE "%WFil%">>"%PFil%\%NFil%.wim"|ENVI WFil=%PFil%\%NFil%.wim|CALL PthName
    _END
    //Подпрограмма Swm-перепаковки
    _SUB ArchSwm
    SET &p=-1
    CALL BlockOp
    FIND $%XFil%=swm,TEAM CALL ArcJoin|EXIT -
    EXEC* --cmd::200:RpakMsg &V=!WLImagex.exe split "%WFil%" "%PFil%\%NFil%.swm" 1000
    TEAM CALL UnBlkOp|FIND $%Brk%=1,EXIT -
    _END
    //Подпрограмма Esd-перепаковки
    _SUB ArchEsd
    SET &p=-1
    CALL BlockOp
    FIND $%XFil%=swm,TEAM CALL ArcJoin|EXIT -
    EXEC* --cmd::200:RpakMsg &V=!WLImagex.exe optimize "%WFil%" --recompress --compress=LZMS:100 --chunk-size=131072
    TEAM CALL UnBlkOp|FIND $%Brk%=1,EXIT -
    TEAM FILE "%WFil%">>"%PFil%\%NFil%.esd"|ENVI WFil=%PFil%\%NFil%.esd|CALL PthName
    CALL UnBlkOp
    _END
    //Подпрограмма блокировки кнопок перед началом операций с архивами
    _SUB BlockOp
    TEAM ENVI Brk=0|ENVI @Button1.Enable=0|ENVI @Button2.Enable=0|ENVI @Button3.Enable=0|ENVI @Button4.Enable=0|ENVI @Button6.Enable=0
    _END
    //Подпрограмма разблокировки кнопок после окончания операций
    _SUB UnBlkOp
    TEAM ENVI @PBAR1_TEXT=|ENVI @PBAR1=0|ENVI @ITEM1.Enable=1
    TEAM ENVI @Button1.Enable=1|ENVI @Button2.Enable=1|ENVI @Button3.Enable=1|ENVI @Button4.Enable=1|ENVI @Button6.Enable=1
    _END
    //Подпрограмма обработки прогресса операции
    _SUB RpakMsg
    //В переменной %&V% находятся текстовые сообщения о ходе процесса. Нам нужно извлечь данные между последними скобками () - например, (34%)
    //Группа: получаем позицию последнего символа "(", потом позицию последнего ")", высчитываем положение начала цифр и длину. Потом (MSTR &p=) получаем цифру как символ(ы) и преобразуем её в цифру (CALC &p=%&p%)
    TEAM RPOS Pos= (,1,%&V%|RPOS Num=) ,1,%&V%|CALC Pos=%Pos%+1|CALC Num=%Num%-%Pos%-6|MSTR &p=%Pos%,%Num%,%&V%|CALC &p=%&p%
    //Если значение < 0, значит, мы ошиблись - выход из подпрограммы
    IFEX %&p% < 0,EXIT -
    //Если значение не изменилось - выход из подпрограммы
    IFEX $%&p% == %&p0%, EXIT -
    //Присваиваем системную переменную прогресс-бару
    ENVI @PBAR1=%&p%
    //Присваиваем системную переменную прогресса в цифрах
    ENVI @PBAR1_TEXT=%&p%%%
    _END
    Вложение

    небольшая утилитка для получения кодов нажатой клавиши и выбора цвета



    Последний раз редактировалось: Гость (2017-03-26 18:49), всего редактировалось 6 раз(а)

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    Joker-2013, без знания команд программы PeCMD бесполезен. Потому как это просто расширенный командный интерпретатор (как-то так). Т.е., "программирование" для него - это как написание батника под cmd.exe.
    Простейший вариант для знакомства с сабжем - набираем в блокноте: MESS Hello World! @ #OK *30000
    сохраняем в файл MyScript.ini. Запускаем "PeCMD.exe LOAD MyScript.ini" или даже "PeCMD.exe MyScript.ini"
    Другой вариант - в блокноте же (либо в любом текстовом редакторе) вводим
    TIPS Attention!,\nThe folder is cleared!,5000,1,
    WAIT 5000

    и потом пробуем запускать. Уточню, что WAIT 5000 /ждать 5 сек/ нужно в данном случае, чтобы сообщение в трее не погасло при завершении скрипта и выходе из PeCMD, в обычном скрипте ждать не нужно.

    [Цитировать]

      Гость
    • Стаж: 54 года
    • Репутация:

      [+] [-]

    А как с китайским бороться в этом окне?
    И что это за шрифт?

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    Шрифт задан в ресурсе "Строковая таблица" (первые строчки - размер:шрифт). В оригинале китайский шрифт, но можно подправить на Arial/Tahoma или другой ходовой. Версия 2012 с Arial.
    Еще нужно найти, где китайский текст на кнопках (Yes/No/OK/Cancel/...)

    [Цитировать]

      ivan petro
    • 161
    • Стаж: 9 лет 2 месяца
    • Сообщений: 25
    • Репутация:0

      [+] [-]
    1940А тут небольшая утилитка для получения кодов нажатой клавиши и выбора цвета.
    Для подбора цветов, цветовой гаммы есть офигенская утилитка ColorPic.
    2177начинается с ....CMPS.
    В хелпе команда cmps. (упаковка)
    Сохранить ресурс, далее PECMD.EXE CMPS -u name.bin name.wcs
    Аналогично в обратную сторону PECMD.EXE CMPS -m name.wcs name.wcz
    -m не шифровать, только упаковка.

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    ivan petro, ай, молодца! Точно, упаковка. Проверил - даже свои скрипты можно упаковывать и применять их в таком виде. Причем как снаружи, так и при добавлении внутрь.
    Может, кому интересно будет - скрипты QemuBootTester (2 версии, упрощенная и полная), прожка из этой темы. Слева - первый вариант, справа - второй.

    [Цитировать]

      Diver
    • 130
    • Стаж: 9 лет 3 месяца
    • Сообщений: 11
    • Репутация:1

      [+] [-]

    Доброго времени суток уважаемые, не знаю будет ли это полезно для перевода....
    Вот собственно все что есть, включая исходники старенькой версии - http://bit.ly/1I1gRuW
    Ох уж эти китайцы

    [Цитировать]

      Eagle123
    • 205
    • Стаж: 9 лет 2 месяца
    • Сообщений: 125
    • Репутация:7

      [+] [-]
    conty9,
    Если просто залить картинкой фон _SUB и LABE, то стиль рамки (border) окна _SUB и панель названия (title bar) становятся квадратными и без прозрачности - ладно там Aero нет в WinPE, но квадратным-то зачем становиться?
    Конфиг сохраненный в ANSI 1251 в WinPE отображается не нормально - вместо русских букв кракозябры. А в обычной винде все хорошо. Шрифтов нужных нет в WinPE чтоли (Tahoma и Times New Roman пробовал) т.к. кнопки с англ. буквами на скрине написаны на Times New Roman, но там явно не этот шрифт...

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    MrEagle, я выкладывал в теме пропатченный вариант PECMD (с использованием шрифта Tahoma - он есть во всех РЕ и нормально отображает русский шрифт). А по поводу претензий - это не ко мне, я не автор. Может, и можно что-то с этим сделать - но я не знаю. А, вообще, как я понимаю, главная задача утилиты - это работа без внешних примочек, в самых урезанных РЕ. Тут уж не до красивостей.
    ivan petro, добавил в пред.сообщение ещё один скрипт - для получения ТТХ.

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    MrEagle, ну, насколько я понимаю, окна PECMD принимают стиль работающей РЕ/ОС (выглядят по-разному в ХР, 7, 8) - т.е., используют системные возможности. А когда применяется фоновое изображение, стиль остается один, определяемый программой. К сожалению, описание возможностей программы только на китайском... но в ней столько всего заложено - что даже в локализированном описании найти порой нереально.
    Кстати, размер готового модуля на базе PECMD можно уменьшить - скрипт добавить в ресурс SCRIPT\101 (или в SCRIPTINIT\100). И удалить почти все остальные ресурсы (оставить только SCRIPT/SCRIPTINIT, Строковая таблица, Версия, Manifest). Получится размер в полмегабайта. А если использовать версию 4.0.2011.0501 (возможности этой версии поскромнее... но для данной задачи их хватит) - то и вообще 140кБ! Если сжать UPX - оба варианта будут ещё раза в два меньше.

    [Цитировать]

      Eagle123
    • 205
    • Стаж: 9 лет 2 месяца
    • Сообщений: 125
    • Репутация:7

      [+] [-]
    conty9,
    Я и ранее использовал Ваши отредактированные версии PECMD со шрифтом Tahoma. просто тогда не обратил внимание, откуда его скачал, а сейчас сравнил по md5, да и ресторатором вскрыл и посмотрел - Ваши файлы :) Только все равно кракозябры в WinPE, а под обычной Виндой все в порядке. Код у меня такой (собственно Ваш немного переделанный):
    CALL @Windows1
    _SUB Windows1,W800H220,Выбор операционной системы,,win.ico,,*background.jpg
    ENVI @this.Font=40:Tahoma
    LABE Text1,L10T20W770H50,Какой Windows необходимо установить?,,0xffffff#0x520018,36
    LABE Text2,L350T95W90H50,или,,0xffffff#0x520018,40
    ITEM Win7,L40T90W290H70,Windows 7,EXEC =setup_win7.cmd,,
    ITEM Win8,L460T90W290H70,Windows 8.1,EXEC =setup_win8.1.cmd,,
    _END
    Да, и иконка куда-то пропадает под WinPE - опять таки в Винде всё в порядке.

    [Цитировать]

      Гость
    • Репутация:0

      [+] [-]
    MrEagle, значит, РЕ нерусская или проблема с кодировкой (должна быть 1251 или 1200). А по иконке - возможно, нужно указать полный путь (можно использовать переменную %CurDir% или %&CurDir% - текущий каталог программы)... но лучше иконку интегрировать.

    Страница 1 из 28


    Показать сообщения:    

    Текущее время: 28-Мар 15:56

    Часовой пояс: UTC + 3


    Вы не можете начинать темы
    Вы не можете отвечать на сообщения
    Вы не можете редактировать свои сообщения
    Вы не можете удалять свои сообщения
    Вы не можете голосовать в опросах
    Вы не можете прикреплять файлы к сообщениям
    Вы можете скачивать файлы