[CMD] Обойти баг cmd и regedit

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#1
Привет.

Собираю некоторый проект,и с удивлением наткнулся на следующий баг:

В некоторые разделы команда reg add записывает параметр по умолчанию в ненадлежащем виде:




А должно быть "значение не присвоено".



Как оказалось для некоторых глаголов и значений реестра это очень серьезная разница.

На данный момент вижу выход только в в reg import или хранить кусок реестра в батнике,но это не есть правильное отношение к скрипту)

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

Не выходит...

Есть мысли?
 

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#2
Дальше - больше.
Запись в неверном формате имеет еще один нулевой байт


В отличии от стандартного



Причем консоль видимо пишет как то не так:
Даже если через echo создать reg файл то он все равно импортируется коряво!

Аж зубы скрипят...
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,277
Симпатии
5,867
Баллы
918
#3
Запись в неверном формате имеет еще один нулевой байт
точней это наверно и является причиной написанного в первом посте. Этот лишний байт принимается как присвоенное значение.
 

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#4
точней это наверно и является причиной написанного в первом посте. Этот лишний байт принимается как присвоенное значение.
я вручную редактировал в двоичном редакторе - не помогает.
причем в другой раздел пишется нормально!
Я вообще в растерянности)Кстати,система при чтении такого параметра не игнорирует разницу,перестает видеть вложенные значения.
 

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,277
Симпатии
5,867
Баллы
918
#5

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#6
А,да кстати!
Забыл)
Например:
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
Попробуйте у кого как,ок?
Через командную строку.
 

Гимаев Наиль

Активный пользователь
Сообщения
59
Симпатии
98
Баллы
98
#7
Саму команду полностью тоже напиши. Чтобы знать, что проверяем то же, что и ты.А зачем вообще записывать значение "(По умолчанию)"? Оно же есть всегда и с нужным тебе значением.
 

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#8
Саму команду полностью тоже напиши
Варианты:
Код:
echo Windows Registry Editor Version 5.00 >%~dp0import.reg
echo.>>%~dp0import.reg
echo ^[^HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\AddLog]>>%~dp0import.reg
reg import %~dp0import.reg
Код:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell\AddLog" /f
Код:
echo n|reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell\AddSave"
И т.д. вплоть до попыток прописать параметр /ve вручную...


А зачем вообще записывать значение "(По умолчанию)"? Оно же есть всегда и с нужным тебе значением.
Так дело в том,что как раз с нужным значением и нету,см. первый пост.
Конечно бы я не стал извращаться.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,962
Симпатии
5,783
Баллы
588
#9
Koza Nozdri, тут понимаешь, какая странная вещь.
Значение - оно как бы есть, но его как бы нет :)

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

Вообщем, запись значения проходит нормально.
Но функция RegQueryValueEx читает старое значение.

WSH-ная RegRead, к примеру, читает нормально. Registry WorkShop тоже.
Я позже попробую еще другими функциями прочитать, и еще нужно попробовать перезагрузиться.

2) Значение "(по-умолчанию)" ты не можешь установить, по тому что это не пустое значение, а его отсутствие.
Грубо говоря, тебе нужно просто удалить параметр:

Код:
reg delete "%key%" /ve /f
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#10
У меня нет)

нужно попробовать перезагрузиться.
Не работает!

Грубо говоря, тебе нужно просто удалить параметр:
Щас испытаю.


Вообщем, запись значения проходит нормально.
Но функция RegQueryValueEx читает старое значение.
WSH-ная RegRead, к примеру, читает нормально. Registry WorkShop тоже.
Даже боюсь спросить как ты это вычислил.
Я некоторое время,достаточное для небольшого нервного расстройства, думал что я тупой пока не понял что это команда Билли перемудрила.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,962
Симпатии
5,783
Баллы
588
#11
Даже боюсь спросить как ты это вычислил.
Я некоторое время,достаточное для небольшого нервного расстройства, думал что я тупой пока не понял что это команда Билли перемудрила.
1) Ну, первый раз хватило перезапустить обычный редактор. Ключ нашел поиском.
Снова перезапустил редактор: ключ пропал О_о. Вот такие пироги.

2) потом через cmd-шную reg query - тоже правильно получает.
RegQueryValueEx из VB6 проверял. Кстати, я забыл отключить 64-битную переадресацию.
Сейчас проверил - нормально получает значение параметра сразу же после его перезаписи из ком. строки.

Т.е. это проблема именно "редактора реестра Windows."
 

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#12
Кстати, я забыл отключить 64-битную переадресацию.
Сейчас проверил - нормально получает значение параметра сразу же после его перезаписи из ком. строки.
Т.е. это проблема именно "редактора реестра Windows."
У меня 32 бита.
Проблема то редактора - тока ОС на нее болезненно реагирует.


Ноль результата...ни через воркшоп,ни через редактор...и система не видит:Dash1:
Зараза...
Что делать то,на vbs для создания раздела переключиться попробую.
Т.е. это проблема именно "редактора реестра Windows."
Да вот если в редакторе вручную сделать или рег файлом импортировать который написан в блокноте - то нормально все.
А если через ту же командную строку собрать рег файл,то уже не работает.
Так что мне кажется консоль тут при делах.
VBS еще не испробовал.
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,962
Симпатии
5,783
Баллы
588
#13
Боюсь спросить.
Код:
set key=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
прописал?

У меня 32 бита.
Проблема то редактора - тока ОС на нее болезненно реагирует.
Ты не понимаешь. Когда я пишу программу на Visual Basic 6, ее нельзя сделать 64-битной. MS не выпускала такой среды.
Поэтому если я из своей программы работаю с реестром, приходится всегда отключать переадресацию.
Тоже самое актуально для все х32-битных программ, например AVZ, SITLog и CheckBrowserLnk (текущих версий) и доступа к файловой системе в т.ч..Я для записанного из cmd в реестр значения специально поиск по реестру и запустил,
чтобы узнать, не записалось ли оно куда то в другое место.Ты вручную внеси запись в реестр и сделай экспорт, пришли сюда и скажи что проверять, а я посмотрю, как работает и что происходит.
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#14
Не подумал просто,читал про это.
Я уже срубаюсь,можешь мне дать скрипт создания через консоль vbs который создаст раздел...ну или я сам завтра.
set key=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
Ну дак!
Я ж не совсем еще того)

Даже для надежности так пробовал:
Код:
echo Windows Registry Editor Version 5.00 >%~dp0import.reg
echo.>>%~dp0import.reg
echo ^[^HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\AddLog]>>%~dp0import.reg
reg import %~dp0import.reg
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\AddLog" /ve /f
Ты вручную внеси запись в реестр и сделай экспорт, пришли сюда и скажи что проверять, а я посмотрю, как работает и что происходит.
Вот рабочий экспорт.

P.S. У меня все лицензионное,криворукость сборщика исключена.
 

Вложения

Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,962
Симпатии
5,783
Баллы
588
#15

Гимаев Наиль

Активный пользователь
Сообщения
59
Симпатии
98
Баллы
98
#16
Даже боюсь спросить как ты это вычислил.
Раз ты уверен, что проблема при записи, то ты сможешь её увидеть через программу procmon.
Думаю, что ты умеешь ею пользоваться, поэтому пишу для тех, кто не умеет.
1. Запускаешь Process Monitor
2. Procmon: Сбрасываешь фильтр (Reset)
3. Запускаешь свой батник
4. Procmon: Останавливаешь запись (ctrl+E)
5. Procmon: Открываешь снова дерево процессов (ctrl+T)
6. Procmon: Находишь cmd и нажимаешь кнопку Include Subtree (Alt+S)
7. Procmon: Оставляешь активность по реестру (пятая кнопка с конца в панели)
8. Procmon: Исключаешь из списка всё что не связано с операциями записи. Для этого право-кликаешь по операции которую нужно исключить в столбце Operation и выбираешь пункт "Exclude <<operation>>"
9. Procmon: Анализируешь последний столбец и понимаешь, что на самом деле происходит в реестре.
 

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#17
Гимаев Наиль, хитрец)
По факту все банально-not fond



Я так понимаю он изначально сообщает что мол не видит значения.

Сейчас еще попробую экспорт заведомо рабочего регфайла через консоль

CMD/BATCH:
reg import "E:\загрузки\Shablony\disk-menu.reg"
И тогда аллелуя - все записывается как надо.
Следовательно проблема или в том как производит запись консоль или в том какие права она имеет...я соответственно под админом все выполняю,иначе и никак.


Однако проблема с консолью остается.

Команда
CMD/BATCH:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell\disk-menu"
CMD/BATCH:
echo Windows Registry Editor Version 5.00 >%~dp0import.reg
echo.>>%~dp0import.reg
echo ^[^HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\AddLog]>>%~dp0import.reg
reg import %~dp0import.reg
в ЛЮБОМ варианте дает пустое значение.

Это загадка по прежнему.

ИМХО дело либо в формате записи (хотя пробовал исключать методами изменения кодировок bat) либо отсутствие прав у админа в консоли...

RegQueryValue = NAME NOT FOUND


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

Примечание Эта функция предусматривается только для совместимости с 16-разрядными версиями Windows. Приложения должны использовать RegQueryValueEx функцию.
Данные должны быть нулевым -завершенная строка.
Я так понимаю с этим проблема,да?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,962
Симпатии
5,783
Баллы
588
#18
Кирилл, не бери в голову, сама система видит вносимые тобою изменения?
Explorer перезагружаешь после внесения твика?
Все опробованные мною функции нормально читают внесенный параметр сразу же.

Код:
taskkill /f /im explorer.exe
start "" explorer.exe
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,580
Симпатии
6,018
Баллы
843
#19
не бери в голову, сама система видит вносимые тобою изменения?
В том то и дело что не видит.

Explorer перезагружаешь после внесения твика?
Все опробованные мною функции нормально читают внесенный параметр сразу же.
перезагружал и комп,и проводник и редактор.
Ноль реакции.
А ты на восьмерке проверял?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,962
Симпатии
5,783
Баллы
588
#20
Расскажи, что я должен увидеть, тогда и проверю.
На сколько понимаю - новые пункты меню, но какого?
Вручную ты создаешь в реестре нужные записи - работает?
 
Сверху Снизу