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

Dragokas написал(а):
SetLocal EnableExtensions EnableDelayedEpansion
:: это не знаю зачем (перейти в кодовую страницу 866. По-умолчанию в консоли всегда 866)
Chcp 866 >nul
В русской локализации да ;), но не всегда. На ХР были траблы с 1251 и никак не мог её убрать из умолчаний. То есть в консоли кракозябы были.

:: Изменить рабочий каталог на каталог, из которого запускается батник
cd /d "%~dp0"
Это точно Нужно ! А то у меня был скрипт который переименовывал курейт в xyz.pif
и иногда перескакивал в system32 и что то таки переименовывал. (нвидиа.. так по мелочи o_O)
 
Последнее редактирование:
Итак получили скрипт:
CMD/BATCH:
@echo off
Chcp 866 >nul
  title  Пункт меню "Создать..."
  SetLocal EnableExtensions

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

(
  echo @echo off
  echo SetLocal EnableExtensions EnableDelayedEpansion
  echo Chcp 866 ^>nul
  echo title text 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"
cls
Echo Пункт создан,перезагрузите компьютер.
Echo Для выхода нажмите Enter
pause>nul
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

Неверно передается строка:
Код:
echo cd /d "%~dp0"
В шаблоне получаем что то типа этого:
Код:
@echo off
SetLocal EnableExtensions EnableDelayedEpansion
Chcp 866 >nul
title Заголовк
cd /d "C:\Users\Fire\Documents\"



pause
exit /B
Надо экранировать.у меня не получается почему то,все равно возвращается путь.
 
Последнее редактирование модератором:
Koza Nozdri, все гениально просто: нужно добавить еще 1 знак %

У тебя классно получилось :)
Проверил на Win 7.
На XP проблемы. Файл создается, но он пустой.

Вот полная текущая версия:
CMD/BATCH:
@echo off
Chcp 866 >nul
  title  Пункт меню "Создать..."
  SetLocal EnableExtensions

ver |>NUL find "6." && if "%1" neq "Admin" call :elevate
chdir /d "%~dp0"

(
  echo @echo off
  echo SetLocal EnableExtensions EnableDelayedEpansion
  echo Chcp 866 ^>nul
  echo title text 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"
cls
Echo Пункт создан,перезагрузите компьютер.
Echo Для выхода нажмите Enter
pause>nul
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
Все - проблему решил.
В XP не было папки ShellNew.

Итого финальный код выглядит вот так:
CMD/BATCH:
@echo off
Chcp 866 >nul
  title  Пункт меню "Создать..."
  SetLocal EnableExtensions

ver |>NUL find "6." && if "%1" neq "Admin" call :elevate
chdir /d "%~dp0"

(
  echo @echo off
  echo SetLocal EnableExtensions EnableDelayedExpansion
  echo Chcp 866 ^>nul
  echo title text title
  echo cd /d "%%~dp0"
  echo.
  echo.
  echo.
  echo pause
  echo exit /B
) > "%~dp0new.bat"

md %systemdrive%\Windows\ShellNew 2>NUL
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"
cls
Echo Пункт создан,перезагрузите компьютер.
Echo Для выхода нажмите Enter
pause>nul
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
 
Последнее редактирование:
Да. Добавляю скрипт туда и на кибер.

lol. Букву X пропустили в SetLocal :D
 
Последнее редактирование:
Чем этот шаблон будет отличаться от чистого листа открытого блокнотом? Можно увидеть здесь пример с пояснениями, добавляемых в шаблон строк?
 
1)Избавляемся от процедур следующего характера:
-Создайте файл,введите код,выберите сохранить как....

Например я часто делаю bat и reg файлы и такая процедура просто угнетает.

2) С точки зрения синтаксиса в 99% код записываемый в шаблон необходим,поэтому так же экономим время на этом.

Построчно код по шаблону:
Код:
@echo off
::Включаем режим выполнения команд без сообщений

SetLocal EnableExtensions EnableDelayedEpansion
:: Включение локализации изменений среды в пакетном файле

Chcp 866 >nul
:: Включение кодировки 866 для того что бы русский текст не был кракозябрами в сценарии

title text title
:: Значение после первого слова title  будет отображаться в названии исполняемого пакетного файла

cd /d "%~dp0"
:: Переход в текущий каталог,сокращает код с параметрами типа del bat.bat вместо del %~dp0bat.bat
::То есть при работе с файлами в папке с bat сценарием не надо дописывать аргументы
:: И при этом вы не рискуете по ошибке запороть систему командой типа: del bat.bat
::Не имеющей в скрипте аргумента cd /d "%~dp0"



pause
:: До того как будет написана финальная версия кода команда pause будет полезная для выявления ошибок и багов
::Либо для принятия решения о доработке кода

exit /B
Выход из текущего пакетного сценария.
Например:
Код:
@echo off
Chcp 866 >nul
  title  Очистка папки Temp
  SetLocal EnableExtensions
 
 
call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"
if "%Family%"=="Vista" if "%1" neq "Admin" call :elevate
cd /d "%~dp0"


attrib  -r -s -a -h -i %tmp%\* /s /d
del /f /s /q /a r s h a i l %tmp%\* >LogDel.txt

pause >nul
echo Для выхода нажмите Enter
exit

: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
pause
 
Последнее редактирование:
Koza Nozdri, +

+ файл сохраняется сразу в кодировке 866.

И тут для русского текста 2 выхода:
1) пользоваться не блокнотом, а спец. редакторами, поддерживающими 866.
2) пользоваться блокнотом Windows, при этом поменяв 2-ю строку на chcp 1251, делая себе медвежью услугу,
т.к. русский текст Вы то получите, но сообщения от служебных команд теперь буду крякозябликами.

Код:
SetLocal
:: Чтобы изменение переменных в этом батнике не влияли на другие батники, запускаемые по цепочке.
:: Для быстрого обнуления всех переменных (особенно актуально для псевдо-массивов), используя команду EndLocal

SetLocal EnableExtensions
:: разрешение использовать дополнительных ключей команд (например FOR /F) и других защит от дурака,
:: например, переход в папку с пробелами без указания кавычек в пути (например CD My Tools)

SetLocal EnableDelayedEpansion
:: Возможность получить актуальное значение переменной внутри цикла или блока команд,
:: например указывая вместо %time% знаки восклицания !time!

На счет 3-х последних команд выложил свою статью, где есть подробно обо всем: https://safezone.cc/threads/cmd-setlocal-i-rasshirennaja-obrabotka-komand.22629/
 
Последнее редактирование:
Koza Nozdri, Кирилл, а как будет, чтобы создавался .CMD файл?
Код:
) > "%~dp0new.cmd"

md %systemdrive%\Windows\ShellNew 2>NUL
copy /y "%~dp0new.cmd" %systemdrive%\Windows\ShellNew\
reg.exe add "HKCR\.cmd\ShellNew" /ve /f
reg.exe add "HKCR\.cmd\ShellNew" /v FileName /d New.cmd /f
del /q "%~dp0new.cmd"

оно?
Просто у CMD более широкие возможности. Какие не скажу (нужно смотреть на конференции dostips.com)
А вообще, иконка родного CMD мне как-то дружелюбнее выглядит.
 
Код:
@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.cmd"

copy /y "%~dp0new.cmd" %systemdrive%\Windows\ShellNew
reg.exe add "HKCR\.cmd\ShellNew" /ve /f
reg.exe add "HKCR\.cmd\ShellNew" /v FileName /d New.cmd /f
del /q "%~dp0new.cmd"
pause
А вообще, иконка родного CMD мне как-то дружелюбнее выглядит.
Можно над иконкой подумать)))
 
Да, у меня тоже самое. Спасибо.
Папку ShellNew нужно создавать обязательно.
 
В том числе.
По-короче давай сделаем. В крайнем случае в комментарий к строке для себя напишем, что Shellnew нет в XP.
 
К тому же после этой команды можешь у себя везде поубирать приставки к путям вида %~dp0, так как ты гарантированно уже находишься именно в каталоге с батником.
К сожалению, %~dp0 приходится писать везде, т.к. cd %~dp0 не работает для батников в сети.
Просто у CMD более широкие возможности.
У cmd такие же возможности как у bat-файлов. Просто в своё время MS ввёл дополнительное расширение, чтобы отличать батники для XP от батников для 9x. Другими словами, можно было дать батнику использующему возможности командного интерпретатора XP расширение CMD и быть уверенным, что его не попытаются запустить на 9x.

В крайнем случае в комментарий к строке для себя напишем, что Shellnew нет в XP.
Есть, но называется она "Шаблоны"
Код:
@echo off
echo Информация о папке с заготовками файлов
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Templates
echo Информация об имени файла
reg query HKCR\.wav\ShellNew
 
CMD/BATCH:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
Chcp 866 >nul
title %computername%
cd /d "%~dp0"



pause
exit /B
Такой вывод могём ?
Разобрался, надо так - echo title %%computername%%
CMD/BATCH:
@echo off
Chcp 866 >nul
  title  Пункт меню "Создать..."
  SetLocal EnableExtensions

ver |>NUL find "6." && if "%1" neq "Admin" call :elevate
chdir /d "%~dp0"

(
  echo @echo off
  echo SetLocal EnableExtensions EnableDelayedExpansion
  echo Chcp 866 ^>nul
  echo title %%computername%%
  echo cd /d "%%~dp0"
  echo.
  echo.
  echo.
  echo pause
  echo exit /B
) > "%~dp0new.cmd"

md %systemdrive%\Windows\ShellNew 2>NUL
copy /y "%~dp0new.cmd" %systemdrive%\Windows\ShellNew\
reg.exe add "HKCR\.cmd\ShellNew" /ve /f
reg.exe add "HKCR\.cmd\ShellNew" /v FileName /d New.cmd /f
del /q "%~dp0new.cmd"
cls
Echo Пункт создан,перезагрузите компьютер.
Echo Для выхода нажмите Enter
pause>nul
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
 

Вложения

  • CreateCMD.zip
    690 байт · Просмотры: 5
Последнее редактирование:
Назад
Сверху Снизу