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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Dragokas, 19 окт 2013.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    Предложение от Koza Nozdri:

    Вырабатываем оптимальный код установщика и шаблона.
     
  2. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    Код ( (Unknown Language)):
    @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 сохранялся шаблон.

    для тех,кто по аналогии решится на эксперименты с другими расширениями-осторожнее с
    Код (Text):
    reg.exe add "HKCR\.bat\ShellNew" /ve /f
      reg.exe add "HKCR\.bat\ShellNew" /v FileName /d New.bat /f
    Если перезапишете какой нибудь параметр с записями-то какой то пункт может и пропасть)))
    Тогда придется в раздел по реестру обращаться восстанавливать.
    --- Объединённое сообщение, 19 окт 2013 ---
    А установщик может и это сойдет?
    http://safezone.cc/threads/reg-avto...nju-fajla-s-pomoschju-ehtogo-zhe-menju.22380/
     
    Последнее редактирование: 19 окт 2013
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    cd "%~dp0"
    нужно, чтобы узер не снес себе что-нибудь при запуске скрипта от админа.

    Код (Text):
    @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 по-моему требует повышенных прав?
     
    Последнее редактирование: 19 окт 2013
    Kиpилл нравится это.
  4. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    это я не понял,каким образом он себе это снесе т?

    кракозябрики тогда будут)))
    если вдруг кодировка другая.


    Да.
    Используем твою функцию getsystem и тестовую запись в раздел
    Код (Text):
    reg.exe add "HKCR\.bat\ShellNew" /ve /f|| call elevate...
    Да?
     
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    Если запустить батник
    Код (Text):
    del *
    с повышенными правами, то операция будет применяться не к текущей папке а к c:\windows\system32
    Я себе один раз так винду снес, правда в моем случае я применил по незнанию код по-жестче (ERD не справилась :eek:)
    Поэтому cd /d "%~dp0" обязательна к знанию и использованию в самом начале.
     
    Последнее редактирование: 19 окт 2013
    Kиpилл нравится это.
  6. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    я про эту часть:
    Код ( (Unknown Language)):
    (
      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" в шаблоне?
    наверное нужно в тело первого скрипта?
     
  7. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    тогда уж что-то одно, либо проверка в лоб, либо анализ сис. версион,
    а конкретно:

    Код (Text):
    call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"
    if "%Family%"=="Vista" call :elevate
    Так ты хочешь, чтобы открывать батник сразу в блокноте и ним же редактировать...
    сейчас попробую в какой кодировке пересохранит файл стандартный блокнот.
     
  8. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    ага,точно.
    надо сразу через функцию.


    ну у меня например нотпад++ и там по умолчанию 866,думаю у многих кто скриптами балуется так примерно тоже.
     
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    Koza Nozdri, норм. шаблон. Смотри:

    сам шаблон + комментарии:
    Код (DOS):

    :: Не отображать на экране консоли исполняемые команды, а только их результат

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

    :: Не закрывать консоль, ожидать нажатия любой клавиши

    pause
    :: Завершить выполнение батника в этом месте
    :: (на случай, если юзер добавит после шаблона новые подпрограммы/функции)
    exit /B
     
    Последнее редактирование: 19 окт 2013
  10. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    вот не пойму я))))
    вот клацнул я мышкой-создан бат файл.
    и в нем сразу заготовка кода.
    Код ( (Unknown Language)):
    :: Изменить рабочий каталог на каталог, из которого запускается батник
    cd /d "%~dp0"
    а для чего его изменять если не в основном скрипте?
    Ты в каждый батник так вписываешь что ли?
    --- Объединённое сообщение, 19 окт 2013 ---
    так бывает и не так)))
     
  11. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    Обертка установщика:

    Код (DOS):
    @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
    --- Объединённое сообщение, 19 окт 2013 ---
    В каждом. Мне так более сейфово.

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

    Вчера случайно запустил ComboFix уже убедился в этом :)
     
    Phoenix и Kиpилл нравится это.
  12. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    А,вот теперь понятно.
    Ну вот кажется и нормально теперь все,заодно я немного просветился....
    --- Объединённое сообщение, 19 окт 2013 ---
    Надо наверное еще
    Код ( (Unknown Language)):
    echo изменения вступят в силу после перезагрузки,появится новый пункт.
    echo Выполнить перезагрузку компьютера сейчас?
     
    Последнее редактирование: 19 окт 2013
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
  14. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    Да,конечно!
    Это же разные уровни доступа и обработка.
    --- Объединённое сообщение, 19 окт 2013 ---
    Как?
     
    Последнее редактирование: 19 окт 2013
  15. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    Текстовый файл с кодировками Win-1251 или DOS - это по сути чистый текст без меток в начале,
    т.е. его можно интерпретировать по-разному.

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

    Можно, конечно, придумать еще одну волшебную кнопку, которая будет определять кодировку и в случае необходимости перекодировать файл,
    но я не представляю в ней полезности.
    Для нас с тобой это точно не нужно.
     
  16. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    солидарен.
    тогда можно считать это финальной версией я так понимаю.
     
  17. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

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

    Вот. :)
     
  18. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    ??????????????????????????


    Это все равно что в булочную за серной кислотой ходить....
    а если не изменить а просто открыть?
    это "что то" тогда должно иметь свое prog id и расширение,что бы ассоциировать его с батником и передать функцию.
    идея кажись не бредовая,но как раз таки не для этого случая,а как выпрямлялка шрифтов наверное.
     
  19. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.309
    Моя новая хотелка :)
    Да ладно. Из разряда выполнимой "фантастики". + отошел от темы.
    Все что нужно - это перехват глагола "Изменить".
    BAT + VBS с самим алгоритмом анализа/перекодировки/отслеживания справятся на отлично, но желания такое делать у меня пока нет.
     
  20. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.225
    Симпатии:
    4.979
    если надумаешь-сделаем)))
     

Поделиться этой страницей