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

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

    [+] [-]
Я проверил у себя. Дейстительно, даже в новых версиях PECMD префикс "!" не оказывает влияния на скрывание программы. Хотя всё остальное работает. Даже, как оказалось, можно извлекать путь из ярлычка (что я давно искал).
Единственное решение - использовать для скрывания окна программы сам PECMD.-I checked with myself. Indeed, even in new versions of PECMD the prefix "!" does not affect program hiding. Although everything else works. Even, as it turned out, you can extract the path from the shortcut (which I have been looking for a long time).
The only solution is to use PECMD itself to hide the program window.
LINK _%Desktop%\RASPPPOE,%SystemRoot%\System32\pecmd.exe,EXEC !%Windir%\System32\RASPPPOE.CMD,RASDIAL.DLL#19
-

Описание LINK

LINK [--f] [-][_|^|!]<ShortcutPath><,DestPath>[,ExecParam][,IconPath#IconIdx][,Rem] [,StartPos][,HK]
LINK [--f] [-][_|^|!]<ShortcutPath><,DestPath>[,ExecParam][,IconPath][,IconIdx][,Rem] [,StartPos][,HK] //Старый стиль
LINK ? [--f] ShortcutPath,[DestPathVarName][,ExecParamVarName][,IconPathVarName [#[IconIdxVarName]]][,RemVarName] [,StartPosVarName][,HKVarName][,DspMarkVarName] //для запроса
Команда LINK служит для создания ярлыка. Также может использоваться для получения информации из готового ярлыка, LINK ?.
ShortcutPath указать путь для создания ярлыка (указывать без расширения ".LNK").
--f не добавлять расширение ".LNK" автоматически.
DestPath указать целевой файл или каталог для ярлыка. Если объект не существует, ярлык не будет создан. Если эта команда используется в командном файле, то DestPath может быть относительным (относительно пути, содержащего файл конфигурации).
ExecParam если необходимо, ключи для целевой программы.
IconPath путь к файлу, содержащему иконку
IconIdx номер иконки в ресурсах файла, если отсутствует - по умолчанию (0)
HK горячая клавиша, обязательно присутствие "#" или "," перед IconIdx.
LINK !%Desktop%\ADSLConnection,RASPPPOE.CMD,,RASDIAL.DLL#19
LINK ? %DeskTop%\ADSLConnection,&FN,&ARG,&FICON#&IICON,&COMMENT,&START,&KEY,&fSHOW
"_" обозначает запуск программы свёрнутой в трее
"^" обозначает запуск программы развёрнутой
"!" запускать скрыто, возможен запуск совмесно с "_" для сворачивания и скрывания окна команды
"*" принудительное создание ярлыка (если DestPath не существует)
"," может быть передано переменной

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

    apinux
  • 1069
  • Стаж: 8 лет 8 месяцев
  • Сообщений: 11
  • Репутация:1

    [+] [-]
@conty9
Very clever, thank you for the solution :)

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

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

    [+] [-]

Скрипт для использования Primo RAM disk под х86 с комментариями

REGI #HKLM\system\ControlSet001\Services\FancyRd\Parameters\EnableIM=0 //Предварительно запрещаем использование невидимой памяти
IFEX MEM=?,MemA //Получаем размер видимой памяти
TEAM EXEC* TEnvi=!cpu64.exe Y|LPOS TEnvi=CPU is 64,1,%TEnvi% //Запускаем утилиту cpu64 для проверки поддержки системой х64 адресации, проверям наличие в выхлопе "CPU is 64"
FIND MEM>2560,IFEX $%TEnvi%=5,REGI #HKLM\system\ControlSet001\Services\FancyRd\Parameters\EnableIM=1 //Если доступной памяти больше 2560Мб и при этом есть поддержка х64 адресации, тогда разрешаем использование невидимой х86 памяти
TEAM EXEC =!frsetup.exe -i1 "X:\Windows\System32\drivers\\"|WAIT 200|EXEC =!frsetup.exe //устанавливаем драйвер при помощи штатного инсталятора Primo frsetup.exe, драйвера fancyrd.* заранее положены в каталог System32\drivers
FORX * 1 2 3 4 5 6 7 8,,TEAM EXEC* MemH=!rxprd.exe mem|FIND $%MemH%=,WAIT 300!EXIT FORX //Пробуем получить информацию о невидимой памяти средствами rxprd.exe, если не получается - ждём 300мс и повторяем до 8 раз
TEAM SED MemH=0,/, ,%MemH%|TEAM MSTR MemH=<7> %MemH%|CALC MemH=%MemH% //Получаем размер невидимой памяти из выхлопа rxprd.exe mem
IFEX $%MemH%<%MemA%,CALC MemA=%MemA%-%MemH%!CALC MemA=128 //Сравниваем количество невидимой и видимой памяти
TEAM ENVI TEnvi=ntfs|CALC #DSize=(%MemA%-128)*6/10+%MemH% //Выбираем файловую систему ntfs и рассчитываем размер РАМ-диска.
IFEX $%DSize%<256,TEAM ENVI TEnvi=fat|CALC DSize=4|PATH X:\Temp //Если рассчитанный размер меньше 256Мб, тогда выбираем файловую систему fat и размер 4Мб (только для монтирования WIM-ов), создаём каталог Temp на Х:\
EXEC =!rxprd.exe add -n %DSize% -t dio -d B -v -i -dmm=COMPACT -f %TEnvi% -c 4KB -l RAMDisk -X -N -T -s //Создаём РАМ-диск, форматируем его
FORX * 1 2 3 4 5 6 7 8,,IFEX B:\,EXIT FORX!WAIT 200 //Ожидаем окончание создания и форматирования.
IFEX X:\TEMP,TEAM ENVI PT=X:\TEMP|FILE --force B:\Temp!TEAM ENVI PT=B:\TEMP|PATH %PT% //Если есть X:\Temp (у нас слишком мало памяти и РАМ-диск 4Мб), тогда назначаем именно X:\Temp в качестве %Temp%
TEAM EXEC =!setenv.exe -m Temp %PT%|EXEC =!setenv.exe -m Tmp %PT% //На всякий случай всем запущенным процессам также указываются выбранный %Temp% и %Tmp%
TEAM REGI HKCU\Environment\TEMP=%PT%|REGI HKCU\Environment\TMP=%PT%
REGI HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\TEMP=%PT%
REGI HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\TMP=%PT% //Прописка %TEMP% и %TMP% в реестре
TEAM ENVI $TEMP=%PT%|ENVI $TMP=%PT%|ENVI //Указание переменных %TEMP% и %TMP% как системных
*** Замечания.
1. Использование невидимой памяти на системах без поддержки х64 адресации - это 100% BSOD.
2. Драйвера Primo RAM disk, в принципе, можно и в систему интегрировать. Но обязательно дефолтное значение EnableIM=0
3. При небольшом количестве памяти лучше в качестве %TEMP% использовать системный диск Х:\, это позволяет эффективнее использовать память, что и отображено в скрипте. Если памяти мало, тогда РАМ-диск создаётся только под монтирование WIM-набора программ.
4. Если скрипт запущен командой MAIN и PECMD используется в качестве главной оболочки, тогда назначение %TEMP% и %TMP% с помощью setenv.exe, как и прописка в реестре, необязательны. Поскольку в таком случае всё, что запущено после выполнения скрипта, будет запущено из PECMD и унаследует переменные сессии PECMD.

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

    avalat
  • 222
  • Стаж: 9 лет 2 месяца
  • Сообщений: 450
  • Репутация:127

    [+] [-]
Обновил справку по PECMD
(Добавлены последние переводы от conty9)

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

    puhpol
  • 2
  • Стаж: 9 лет 4 месяца
  • Сообщений: 888
  • Репутация:73

    [+] [-]
Приветствую господа! aa
Сделал отдельный форум для PECMD.
Тему перенес.

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

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
conty9, aa
Маленький вопрос, не могу понять поведение PeCmd скрипта.
find $ "%StartMode%" = "Admin" , {
  logs %WinDir%\Logs\PecmdAdmin.log
  call OSInit
  logo %WinDir%\web\wallpaper\Windows\img0.jpg
  exec SwitchToAdmin.a3x
  call PreShell
  call AudioInit
  call NetInit
  call Shortcuts
  call PinTo
  regi --reg_sz hklm\system\setup\$user$,User
  regi HKLM\system\setup\$user$!
  find $ "%User%" = "Admin" , {
    call Admin
// ???? Если убрать  exit  , то почему-то  call Admin выполняется два раза.
    exit
  }
  find $ "%User%" = "System" , {
    call LoadShell
// ???? Аналогичная ситуация.
    exit
  }
}
exit
Пробовал вместо find использовать ifex - результат тот-же.

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

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

    [+] [-]
nikzzzz,

а если так:

find $%StartMode%=Admin,
{* logs %WinDir%\Logs\PecmdAdmin.log
call OSInit
logo %WinDir%\web\wallpaper\Windows\img0.jpg
exec SwitchToAdmin.a3x
call PreShell
call AudioInit
call NetInit
call Shortcuts
call PinTo
regi --reg_sz hklm\system\setup\$user$,User
regi HKLM\system\setup\$user$!
find $%User%=Admin,call Admin!call LoadShell
} MESS Done
Ошибки в твоём скрипте: спецсимволы могут относиться и к команде (FORX * 1 2 3 и FORX* 1 2 3 - идентичные команды), и к переменной. У тебя $ должен относиться к переменной %StartMode%, но find $ %StartMode% = find$ %StartMode%, что неверно, нужно find $%StartMode%. Кавычки в PECMD обычно вобще не нужны, только для вызова внешних утилит (например, при передаче пути с пробелами). Т.е., ENVI MyPath=Мой путь\Моя папка - отработает и без кавычек верно. Более того, если нам нужен пробел в конце, тогда это можно тоже сделать так: TEAM ENVI MyPath=Мой путь\Моя папка | (т.е., в переменную MyPath попадёт всё до разделителя "|"). Со скобками тоже ошибка: они начинаются с новой строки всегда. Если после открывающей скобки есть *, тогда можно в той же строке писать комманды, если нет - тогда только в новой. После закрывающей скобки допустимо тоже писать команды, но только не условные (FIND/IFEX/FORX и т.п.), а прямого действия (REGI/ENVI/CALL/...). Далее: если у нас одна команда прямого действия, можно сразу её писать после FIND/IFEX, также можно объединять несколько таких комманд с помощью TEAM. Ну и напоследок - как я понимаю, у нас только два возможных пользователя: Admin и System, поэтому окончание можно упростить: если не Admin, тогда точно System. И ещё - exec SwitchToAdmin.a3x допустимо, если мы точно уверены в том, что скрипт ассоциирован в системе. Лучше и быстрее (чтобы ОС/РЕ не искала ассоциацию) запускать прямо exec =!Autoit.exe SwitchToAdmin.a3x (запустить с ожиданием в скрытом режиме). Скрипт SwitchToAdmin.a3x, думаю, тоже можно переписать под PECMD, тогда вообще будет кошерно. Я в своё время в РЕ практически всё из батников и скриптов Autoit перенёс в PECMD, стало намного компактнее и быстрее работать.

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

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
conty9, aa
Спасибо за консультацию, пока написанное понял только частично, слишком много информации сразу, разберусь.
Ты привел пример оптимизированного скрипта, спасибо, конечно, но хотелось бы увидеть наоборот не оптимизированную версию, чтобы наглядно увидеть свои ошибки, желательно без специфичного использования спец. символов, без использования team и т.п.
К тому-же не факт, что не понадобится еще что-то добавить, например
73177если не Admin, тогда точно System
не верно, может быть пустое значение, ошибка, которую нужно обработать, может потребоваться выполнить не просто выполнить call Admin, а еще несколько команд и т.п.
Мне важно научиться писать скрипты, что-бы в дальнейшем не допускать подобных ошибок, дальше уже и можно заняться оптимизацией.
Пока для понимания, читаемость скрипта на первом месте, пусть даже он не оптимален.

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

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

    [+] [-]
nikzzzz, я твой же скрипт привел, только с исправленным синтаксисом. TEAM я не использовал. Единственная оптимизация - в конце. Без неё:
find $%User%=Admin,
{
call Admin
}
find $%User%=System,
{
call LoadShell
}-Но такая простыня со скобками не нужна для одной команды, достаточно так написать:
find $%User%=Admin,call Admin
find $%User%=System,call LoadShell

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

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
conty9
Спасибо, я уже разобрался по твоему микромануалу, где у меня была ошибка. az
73184Но такая простыня со скобками не нужна
Такая простыня нужна мне, по крайней мере до тех пор, пока не обучусь хотя бы основам PeCmd.
Да и как бы я узнал, например о том, что
73177Со скобками тоже ошибка: они начинаются с новой строки всегда.
если бы написал просто
find $%User%=Admin,call Admin
Возможно, где-то в мануале это и описано, но найти достаточно сложно, особенно когда точно не знаешь, что ищешь.
А со скобками, ну нравится мне этот синтаксис, он более естественнен, чем например team, да и там можно нарваться на проблемы, например с использованием символа "|"
Imxo, у каждого свои бзики. al

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

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

    [+] [-]
nikzzzz, там ещё вроде ошибка с
regi --reg_sz hklm\system\setup\$user$,User
Я не помню, можно ли так указать (пишу с телефона). Указание типа данных тоже спецсимволами, т.е., примерно так
regi $hklm\system\setup\$user$,User
Глянь в моих примерах, там расписаны.

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

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
conty9,
73188там ещё вроде ошибка
Я прочитал английский хелп (китайски не осилил al ), там узнал много полезной для себя информации, например о том, что спец. символы во многих случаях имеют нормально читаемый эквивалент (скорее наоборот, спец. символ является просто его сокращением).
К примеру, команда exec может запускаться с ключами [-wait] [-hide] , которые могут быть заменены спец символами.
Для меня проще написать exec -wait ..., чем exec =... , не нужно вспоминать или обращаться к нелпу, за руководством по использованию символа "=", тем более он неоднозначен.
В примере ошибки нет, для regi "--reg_sz" и "$" эквивалентны.

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

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

    [+] [-]
Ну, про нормальные ключи для EXEC я тоже знал, а вот для REGI - сомневался. В остальном - дело привычки. У меня скрипты утилит по 5-8кБ текста, невольно стремишься его минимизировать как в ширину, так и в высоту. ))
И то, что одно и то же можно сделать с помощью нескольких комманд и несколькими способами - нравится. Хотя, глядя на свои первые скрипты, возникает желание переписать их заново, настолько они неоптимально написаны. Но лень. ))

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

    puhpol
  • 2
  • Стаж: 9 лет 4 месяца
  • Сообщений: 888
  • Репутация:73

    [+] [-]
Вопрос:
Запуск программы с определенными параметрами допустим:
UltraISO-9.7.2.3561.exe /VERYSILENT
А PECMD так может?

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

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

    [+] [-]
puhpol, может. Указываем путь к исполняемому файлу и ключи запуска.
EXEC =!7zip.exe e -y DaRT_RE.7z %TEnvi%\Exp*.* %TEnvi%\faux*.*


Последний раз редактировалось: Гость (2020-02-17 19:04), всего редактировалось 2 раз(а)

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


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

Текущее время: 29-Мар 03:06

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


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