Создание каскадного меню [утилита Cascade Menu Creator]

Оно ж у тебя все в скобках.
В скобках ты и присваиваешь, а значит в них же ты новое значение можешь получить только через !onepunkt1!
не забыв объявить директивой SetLocal EnableDelayedExpansionПри этом знаки ! в именах использовать не сможешь.

Или думай как избавится от скобок.
Можно конечно сделать вот так:

Код:
call echo.>>"%~dp0ttools\UserReg\%%onepunkt1%%.reg"

Но это тебе почти во всех строках придется так прописывать call и двойные %%.
 
Последнее редактирование:
решил reg query вызывать через call
CMD/BATCH:
:onepunkt1
 call :queryonepunkt1

echo Пункт №1
echo.
set /p name_onepunkt1="Ведите имя пункта меню и нажмите клавишу Enter: "

echo Введено "%name_onepunkt1%"
pause
copy "%~dp0ttools\ishodnik\reg.reg" "%~dp0ttools\UserReg\%onepunkt1%.reg"
echo Windows Registry Editor Version 5.00 >"%~dp0ttools\UserReg\%onepunkt1%.reg"
echo.>>"%~dp0ttools\UserReg\%onepunkt1%.reg"
echo ^[^HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\%onepunkt1%]>>"%~dp0ttools\UserReg\%onepunkt1%.reg"
reg import "%~dp0ttools\UserReg\%onepunkt1%.reg"
reg add "%key2%\%onepunkt1%" /ve /d "%name_onepunkt1%" /f  
reg add "%key2%\%onepunkt1%" /v "Icon" /t REG_SZ /d "imageres.dll,104" /f 
reg add "%key1%\%name%" /v "SubCommands" /d "%onepunkt1%;AddLog;prochee" /f 

 echo @echo off >"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo set txt_file="%~dp0ttools\UserTxt\%onepunkt1%.txt" >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo if not exist %%txt_file%% goto _error  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo :_clip  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo "%%SystemRoot%%\System32\clip.exe" ^<^ %%txt_file%%  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo exit  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo :_error  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo echo %%txt_file%% - file not found  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo pause  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo exit /B >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 
Последнее редактирование:
В принципе алгоритм додумал,макет корявенький даже работает.

У меня некоторая сложность:
CMD/BATCH:
echo Раздел %name% уже существует,перезаписать его или отменить операцию?
Как мне прочитать и вывести в переменную имя параметра (MUIVerb или по умолчанию) ?

reg query тут опять по ходу в помощь,может есть какие то удобные решения а то я велосипед опять пойду изобретать)
 
имя параметра (MUIVerb или по умолчанию) ?
Значение параметра?

Вот проверенная временем функция.
Ограничение: неправильно читает параметры, в имени которых есть пробел.
Код:
@echo off
SetLocal EnableExtensions

call :Reg_Read "HKCU\Environment" "TEMP" "Data" "Type"

echo TEMP=%Data%. Тип данных: %Type%

pause & Exit /B

:Reg_Read
  :: %1-вх.Раздел
  :: %2-вх.Имя параметра
  :: %3-исх.Переменная для хранения значения
  :: %4-исх.(опционально)-Переменная для хранения типа параметра
  set "%~3="& if "%~4" neq "" set "%~4="
  For /f "tokens=2*" %%a In ('Reg.exe query "%~1" /v "%~2"') do (
    set "%~3=%%~b"& if "%~4" neq "" set "%~4=%%~a"
  )
Exit /B

Переходи уже на VBS. Такие сложные штуки не гоже на батниках писать.
Там хоть среда отладки какая-никакая есть. Редакторы.
В крайнем случае в Excel-е (VBA) можно отладить полноценно.
 
Последнее редактирование:
На vbs пока ума не хватает... да,с пробелами беда,они будут однозначно как ты видел в прототипе.

Есть идея вывести через echo ,попробую.
Как вариант встроить команду с vbs?
 
Для пробелов я тоже писал функцию. Но она получилась очень большая ))

Как вариант встроить команду с vbs?
Можно. Но тогда давай в новой теме.
Еще ведь нужно предусмотреть варианты, что возвращать,
если не нашлось такого имени параметра, или если не хватило прав.
Какие операции еще нужны тебе кроме чтения.
На vbs пока ума не хватает
А что не так? Давай учится... на примере этой темы.
Тебе всего навсего нужно - работа с реестром (в полезных примерах все расписано),
работа с текстом, организовать меню.

Если честно, писать на батниках такую работу с вложенными разделами меня не радует.
Предыдущий опыт с контекстным меню получился не очень.У тебя ведь небольшой опыт на VB.NET был ?
 
Последнее редактирование:
Как вариант
CMD/BATCH:
@echo on
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\AddLog" /v MUIVerb >%~dp0j.txt
for /f scip 1 и т.д.
но кажется это галиматья.

У тебя ведь небольшой опыт на VB.NET был ?
да,был.
Пригодится?

Давай учится... на примере этой темы.
Давай!
Создать новую?
 
Понимаешь Кирилл, проблемы начинаются там,
где ты попытаешься этот же скрипт запустить и на XP, и на Win7,
а у них версии файла reg.exe сильно разнятся. Формат вывода другой.
А в CMD непросто работать со сложным парсингом строк.
Создать новую?
Давай. Буду объяснять все последовательно, но в одной теме обо всем.
Один вопрос: как сделать то-то. Аналог такой то команды? Один ответ...
Dragokas написал(а):
У тебя ведь небольшой опыт на VB.NET был ?
да,был.
Пригодится?
Нет. Не пригодится. Зачем нам груз в виде необходимости установки .Net Framework.
Просто есть много похожих методов и функций.
 
Последнее редактирование:
ты попытаешься этот же скрипт запустить и на XP, и на Win7,
сейчас исключительно для ос старше виста,про хр отдельная песня по твикам.

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

в пятницу много времени планирую посвятить этому вопросу и практике,конечно,если у тебя будет возможность то здорово.
 
Ок. Тогда в раздел VBS. Это можно тоже изучать на практике.
В глубокую теоретику вдаваться по необходимости.
Там и расскажу. Постараюсь еще начальный материал дать вроде,
как понимать ошибки и как отлаживать (собственно CMD такими возможностями не похвастается).
 
Вообщем решил, что сам напишу. Помогут.
Логику работы с реестром, конечно, серъезно надо продумать.
Псевдонимы пунктов меню в реестр записывать тупо транслитом?
А если русскими буквами - он поймет? А если еще и с пробелами?
 
Логику работы с реестром, конечно, серъезно надо продумать.
Псевдонимы пунктов меню в реестр записывать тупо транслитом?
А если русскими буквами - он поймет? А если еще и с пробелами?
Логика работы с реестром продумана.

Смотри:
Создаем родительский раздел
Код:
HKEY_CLASSES_ROOT\DesktopBackground\Shell\melpmemu
Далее (как ты наверняка помнишь из смежных тем) мы ограничены правилом 13 объектов.

Соответственно мы заранее должны определиться в количество двойных раскрывающихся меню.
Я исходил из оптимального на мой взгляд числа три.

Итого в трех двойных каскадных меню и одном классическом мы набираем 4 варианта с максимальным числом 13,умножаем и получаем 52 раздела в
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell
+ к ним еще 3 для папок двойных меню.

Итого 55 разделов,не считая основных (
Код:
HKEY_CLASSES_ROOT\DesktopBackground\Shell\melpmemu
)


Псевдонимы пунктов меню в реестр записывать тупо транслитом?
Отсюда следует что имеет смысл создать 4 набора псевдонимов (это если только для меню рабочего стола) с понятными для нас и программы логическими именами (на латинице!)

Например:
Код:
namemenu
ctxlink1
ctxlink2
...
ctxlink13

ctxnamemeu1

ctxmenu1link1
ctxmenu1link2
...
ctxmenu1link13

ctxnamemeu2

ctxmenu2link1
ctxmenu2link2
...
ctxmenu2link13


ctxnamemeu3

ctxmenu3link1
ctxmenu3link2
...
ctxmenu3link13

А для взаимодействия пользователя с объектами будем читать не имена разделов или параметров в реестре,а пользовательские имена из глаголов

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

В общем все неприятные лавры.

Поэтому я изначально и придерживался такого алгоритма.

+ есть возможность невероятно удобных двух кнопочек на нашем твикере:

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

2)ровно по такому же принципу мы имеем возможность добавить кнопочку "удалить" в которой можно будет грохнуть не только наш пункт но и любой другой

3)опять из за вышеописанного мы сможем дать пользователю дать возможность настраивать общее контексное меню на его вкус)

Что скажешь?
Есть кому,да?
 
Демо.
Нажми правой кнопкой по форме.
 

Вложения

  • DemoMenu.zip
    9.5 KB · Просмотры: 4
По-моему в условиях дикого ограничения числом 13 кнопки добавить-удалить - излишество,
которые только будут занимать место. Можно добавить по желанию пользователя в одно
из меню вызов этой утилиты настройки.
Думаю, этого будет достаточно.
 
Так я и имел ввиду добавить эти кнопки в меню утилиты)
Демо.
Нажми правой кнопкой по форме.
upload_2014-8-6_17-57-46.png
 
Весь исходник. На win8 не проверял.
Попробуй запустить из под IDE без компиляции.
Скажи на какой строке ошибка.
Есть вероятность, что среда может зависнуть. Будь аккуратен.
 

Вложения

  • MoveableMenu.zip
    15.9 KB · Просмотры: 4
Работает.
А если без ПКМ а сразу в меню?А я вот кнопку по координатам бегать заставил:
(пока одна для образца)
 

Вложения

  • test.rar
    42.7 KB · Просмотры: 5
Назад
Сверху Снизу