Создание шаблона батника через контекстное меню

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,814
Реакции
6,593
Предложение от Koza Nozdri:

ты пишешь что создаешь их путем использования редакторов.
я себе в контексное меню сделал-мышкой клацнул и готов,уже с заготовкой кода.

не знаю полезно ли это другим,но могу дать.

Вырабатываем оптимальный код установщика и шаблона.
 
Код:
@echo off
Chcp 866 >nul
  title  Пункт меню "Создать..."

  echo @echo off>%~dp0new.bat
  echo  Chcp 866 >nul >>%~dp0new.bat
  echo  title  >>%~dp0new.bat
echo.>>%~dp0new.bat
echo.>>%~dp0new.bat
  echo pause>>%~dp0new.bat
  copy /y %~dp0new.bat %systemdrive%\Windows\ShellNew
  reg.exe add "HKCR\.bat\ShellNew" /ve /f
  reg.exe add "HKCR\.bat\ShellNew" /v FileName /d New.bat /f
  del /q %~dp0new.bat

  pause

пункт появится после перезагрузки.

это для висты и выше.
заготовку то любую можно вставить.
надо как то сделать чтобы в кодировке 866 сохранялся шаблон.

для тех,кто по аналогии решится на эксперименты с другими расширениями-осторожнее с
Код:
reg.exe add "HKCR\.bat\ShellNew" /ve /f
  reg.exe add "HKCR\.bat\ShellNew" /v FileName /d New.bat /f
Если перезапишете какой нибудь параметр с записями-то какой то пункт может и пропасть)))
Тогда придется в раздел по реестру обращаться восстанавливать.А установщик может и это сойдет?
https://safezone.cc/threads/reg-avt...nju-fajla-s-pomoschju-ehtogo-zhe-menju.22380/
 
Последнее редактирование:
cd "%~dp0"
нужно, чтобы узер не снес себе что-нибудь при запуске скрипта от админа.

Код:
@echo off
Chcp 866 >nul
title  Пункт меню "Создать..."

(
  echo @echo off
  echo SetLocal EnableExtensions EnableDelayedEpansion
  echo Chcp 866 ^>nul
  echo title Заголовк
  echo cd /d "%~dp0"
  echo.
  echo.
  echo.
  echo pause
  echo exit /B
) > "%~dp0new.bat"

copy /y "%~dp0new.bat" %systemdrive%\Windows\ShellNew
reg.exe add "HKCR\.bat\ShellNew" /ve /f
reg.exe add "HKCR\.bat\ShellNew" /v FileName /d New.bat /f
del /q "%~dp0new.bat"
pause

Лично я не вижу смысле chcp 866, она и так идет по-умолчанию.
За всю историю в начале батника никогда не приходилось ее использовать.

Знак > нужно экранировать ^> иначе туда и запишет в NUL :)
Кавычки подобавлял.
А запись в HKCR по-моему требует повышенных прав?
 
Последнее редактирование:
cd "%~dp0"
нужно, чтобы узер не снес себе что-нибудь при запуске скрипта от админа.
это я не понял,каким образом он себе это снесе т?

Лично я не вижу смысле chcp 866, она и так идет по-умолчанию.
За всю историю в начале батника никогда не приходилось ее использовать.
кракозябрики тогда будут)))
если вдруг кодировка другая.


А запись в HKCR по-моему требует повышенных прав?
Да.
Используем твою функцию getsystem и тестовую запись в раздел
Код:
reg.exe add "HKCR\.bat\ShellNew" /ve /f|| call elevate...

Да?
 
Если запустить батник
Код:
del *
с повышенными правами, то операция будет применяться не к текущей папке а к c:\windows\system32
Я себе один раз так винду снес, правда в моем случае я применил по незнанию код по-жестче (ERD не справилась :eek:)
Поэтому cd /d "%~dp0" обязательна к знанию и использованию в самом начале.
 
Последнее редактирование:
я про эту часть:
Код:
(
  echo @echo off
  echo SetLocal EnableExtensions EnableDelayedEpansion
  echo Chcp 866 ^>nul
  echo title Заголовк
  echo cd /d "%~dp0"
  echo.
  echo.
  echo.
  echo pause
  echo exit /B
) > "%~dp0new.bat"

это же то что будет создаваться в качестве шаблона при нажатии в пункте "создать командный файл" в контексном меню "создать"

для чего cd /d "%~dp0" в шаблоне?
наверное нужно в тело первого скрипта?
 
reg ... || call elevate
и SystemVersion
тогда уж что-то одно, либо проверка в лоб, либо анализ сис. версион,
а конкретно:

Код:
call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"
if "%Family%"=="Vista" call :elevate

кракозябрики тогда будут)))
если вдруг кодировка другая.
Так ты хочешь, чтобы открывать батник сразу в блокноте и ним же редактировать...
сейчас попробую в какой кодировке пересохранит файл стандартный блокнот.
 
тогда уж что-то одно, либо проверка в лоб, либо анализ сис. версион,
а конкретно:
ага,точно.
надо сразу через функцию.


Так ты хочешь, чтобы открывать батник сразу в блокноте и ним же редактировать...
ну у меня например нотпад++ и там по умолчанию 866,думаю у многих кто скриптами балуется так примерно тоже.
 
Koza Nozdri, норм. шаблон. Смотри:

сам шаблон + комментарии:
CMD/BATCH:
:: Не отображать на экране консоли исполняемые команды, а только их результат
@echo off
:: SetLocal - Локализовать все новые/изменяемые переменные в пределах этого батника
:: EnableExtensions - включить поддержку дополнительных ключей (например, FOR /F, Chdir /D и пр...)
:: если эта опция была отключена в реестре.
:: EnableDelayedEpansion - возможность использовать знаки восклицания (!) для раскрытия актуального значения переменной
:: под скобками, в блоках команд, циклах.
SetLocal EnableExtensions EnableDelayedEpansion
:: это не знаю зачем (перейти в кодовую страницу 866. По-умолчанию в консоли всегда 866)
Chcp 866 >nul
:: Заголовок окна консоли
title Заголовк
:: Изменить рабочий каталог на каталог, из которого запускается батник
cd /d "%~dp0"

:: Не закрывать консоль, ожидать нажатия любой клавиши
pause
:: Завершить выполнение батника в этом месте
:: (на случай, если юзер добавит после шаблона новые подпрограммы/функции)
exit /B
 
Последнее редактирование:
:: Изменить рабочий каталог на каталог, из которого запускается батник
cd /d "%~dp0"
вот не пойму я))))
вот клацнул я мышкой-создан бат файл.
и в нем сразу заготовка кода.
Код:
:: Изменить рабочий каталог на каталог, из которого запускается батник
cd /d "%~dp0"
а для чего его изменять если не в основном скрипте?
Ты в каждый батник так вписываешь что ли?
:: это не знаю зачем (перейти в кодовую страницу 866. По-умолчанию в консоли всегда 866)
так бывает и не так)))
 
Обертка установщика:

CMD/BATCH:
@echo off
SetLocal EnableExtensions

call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"
if "%Family%"=="Vista" if "%1" neq "Admin" call :elevate
chdir /d "%~dp0"

::
:: <--- Здесь код установщика контекстного меню
::

pause
exit /B

:Elevate
  Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"Admin","","runas",1 >"%~dp0Elevating.vbs"
  cscript.exe //nologo "%~dp0Elevating.vbs" "%~dpnx0"
  del "%~dp0Elevating.vbs"
Exit

:GetSystemVersion [OSVersion] [OSCore] [OSBuild] [OSFamily] [EnvironmentCore]
  Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x32
  set %~5=x32& if "%xOS%"=="x64" echo "%PROGRAMFILES%" |>nul find "x86" || set %~5=x64
  set "%~2=%xOS%"
  set _key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentBuildNumber"^|Find "CurrentBuildNumber"') do set "%~3=%%~b"
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentVersion"^|Find "CurrentVersion"') do set "_ver=%%~b"
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "ProductName"^|Find "ProductName"') do set "%~1=%%~b"
  if "%_ver:~0,1%"=="6" (set "%~4=Vista") else (set "%~4=NT")
Exit /B
а для чего его изменять если не в основном скрипте?
Ты в каждый батник так вписываешь что ли?
В каждом. Мне так более сейфово.

К тому же после этой команды можешь у себя везде поубирать приставки к путям вида %~dp0, так как ты гарантированно уже находишься именно в каталоге с батником.

Dragokas написал(а):
:: это не знаю зачем (перейти в кодовую страницу 866. По-умолчанию в консоли всегда 866)
так бывает и не так)))
Вчера случайно запустил ComboFix уже убедился в этом :)
 
В каждом. Мне так более сейфово.
К тому же после этой команды можешь у себя везде поубирать приставки к путям вида %~dp0, так как ты гарантированно уже находишься именно в каталоге с батником.
А,вот теперь понятно.
Ну вот кажется и нормально теперь все,заодно я немного просветился....Надо наверное еще
Код:
echo изменения вступят в силу после перезагрузки,появится новый пункт.
echo Выполнить перезагрузку компьютера сейчас?
 
Последнее редактирование:
Последнее редактирование:
Текстовый файл с кодировками Win-1251 или DOS - это по сути чистый текст без меток в начале,
т.е. его можно интерпретировать по-разному.

Блокнот естественно русский текст (866) видит крякозябрами.
И наоборот, если в блокноте набирать русский, то открыв в редакторе (как 866), вместо русского будут иероглифы,
поэтому универсального тут ничего не придумаешь.

Можно, конечно, придумать еще одну волшебную кнопку, которая будет определять кодировку и в случае необходимости перекодировать файл,
но я не представляю в ней полезности.
Для нас с тобой это точно не нужно.
 
Мне этот оффтоп видится так, что когда мы нажимаем по батнику кнопку "Изменить"
запускается что-то (вместо блокнота).
Это что-то:
1) определяет кодировку батника по косвенным признакам (смотрит русский текст).
2) Если она не Win-1251, копирует файл в другое место, перекодирует в Win-1251.
3) Передает команду блокноту открыть этот файл.
4) Отслеживаем пока работает блокнот.
5) Если блокнот закрыт и ним были внесены изменения в батник,
перекодирует обратно файл в OEM-866, и копирует файл обратно заменяя старый батник.

Вот. :)
 
??????????????????????????


Это все равно что в булочную за серной кислотой ходить....
а если не изменить а просто открыть?
это "что то" тогда должно иметь свое prog id и расширение,что бы ассоциировать его с батником и передать функцию.
идея кажись не бредовая,но как раз таки не для этого случая,а как выпрямлялка шрифтов наверное.
 
Моя новая хотелка :)
Да ладно. Из разряда выполнимой "фантастики". + отошел от темы.
Все что нужно - это перехват глагола "Изменить".
BAT + VBS с самим алгоритмом анализа/перекодировки/отслеживания справятся на отлично, но желания такое делать у меня пока нет.
 
Назад
Сверху Снизу