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

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Привет.

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

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

upload_2014-7-2_12-3-10.png



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

upload_2014-7-2_12-4-7.png


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

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

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

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

Есть мысли?
 
Дальше - больше.
Запись в неверном формате имеет еще один нулевой байт
upload_2014-7-2_18-31-33.png


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

upload_2014-7-2_18-32-13.png


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

Аж зубы скрипят...
 
Запись в неверном формате имеет еще один нулевой байт
точней это наверно и является причиной написанного в первом посте. Этот лишний байт принимается как присвоенное значение.
 
точней это наверно и является причиной написанного в первом посте. Этот лишний байт принимается как присвоенное значение.
я вручную редактировал в двоичном редакторе - не помогает.
причем в другой раздел пишется нормально!
Я вообще в растерянности)Кстати,система при чтении такого параметра не игнорирует разницу,перестает видеть вложенные значения.
 
А,да кстати!
Забыл)
Например:
Код:
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 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 вручную...


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

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

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

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

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

Код:
reg delete "%key%" /ve /f
 
Последнее редактирование:
Registry WorkShop тоже.
У меня нет)

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

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


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

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

Т.е. это проблема именно "редактора реестра Windows."
 
Кстати, я забыл отключить 64-битную переадресацию.
Сейчас проверил - нормально получает значение параметра сразу же после его перезаписи из ком. строки.
Т.е. это проблема именно "редактора реестра Windows."
У меня 32 бита.
Проблема то редактора - тока ОС на нее болезненно реагирует.


Ноль результата...ни через воркшоп,ни через редактор...и система не видит:Dash1:
Зараза...
Что делать то,на vbs для создания раздела переключиться попробую.
Т.е. это проблема именно "редактора реестра Windows."
Да вот если в редакторе вручную сделать или рег файлом импортировать который написан в блокноте - то нормально все.
А если через ту же командную строку собрать рег файл,то уже не работает.
Так что мне кажется консоль тут при делах.
VBS еще не испробовал.
 
Последнее редактирование:
Боюсь спросить.
Код:
set key=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
прописал?

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

Вложения

  • disk-menu.7z
    291 байт · Просмотры: 7
Последнее редактирование:
Даже боюсь спросить как ты это вычислил.
Раз ты уверен, что проблема при записи, то ты сможешь её увидеть через программу 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: Анализируешь последний столбец и понимаешь, что на самом деле происходит в реестре.
 
Гимаев Наиль, хитрец)
По факту все банально-not fond

upload_2014-7-3_23-29-49.png


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

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

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 функцию.
Данные должны быть нулевым -завершенная строка.
Я так понимаю с этим проблема,да?
 
Последнее редактирование:
Кирилл, не бери в голову, сама система видит вносимые тобою изменения?
Explorer перезагружаешь после внесения твика?
Все опробованные мною функции нормально читают внесенный параметр сразу же.

Код:
taskkill /f /im explorer.exe
start "" explorer.exe
 
Последнее редактирование:
не бери в голову, сама система видит вносимые тобою изменения?
В том то и дело что не видит.

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