Обойти баг cmd и regedit

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Kиpилл, 2 июл 2014.

  1. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    Привет.

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

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

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


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

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

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

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

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

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

    Есть мысли?
     
  2. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    Дальше - больше.
    Запись в неверном формате имеет еще один нулевой байт
    upload_2014-7-2_18-31-33.png

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

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

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

    Аж зубы скрипят...
     
  3. regist
    Оффлайн

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    точней это наверно и является причиной написанного в первом посте. Этот лишний байт принимается как присвоенное значение.
     
  4. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    я вручную редактировал в двоичном редакторе - не помогает.
    причем в другой раздел пишется нормально!
    Я вообще в растерянности)
    --- Объединённое сообщение, 2 июл 2014, Дата первоначального сообщения: 2 июл 2014 ---
    Кстати,система при чтении такого параметра не игнорирует разницу,перестает видеть вложенные значения.
     
  5. regist
    Оффлайн

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    ты бы лучше указал проблемные разделы, или предлагаешь другим найти их самостоятельно ? :)
     
    Kиpилл нравится это.
  6. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    А,да кстати!
    Забыл)
    Например:
    Код (Microsoft Registry):
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
    --- Объединённое сообщение, 2 июл 2014 ---
    Попробуйте у кого как,ок?
    Через командную строку.
     
  7. Гимаев Наиль
    Оффлайн

    Гимаев Наиль Пользователь

    Сообщения:
    59
    Симпатии:
    98
    Саму команду полностью тоже напиши. Чтобы знать, что проверяем то же, что и ты.
    --- Объединённое сообщение, 2 июл 2014, Дата первоначального сообщения: 2 июл 2014 ---
    А зачем вообще записывать значение "(По умолчанию)"? Оно же есть всегда и с нужным тебе значением.
     
  8. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    Варианты:
    Код (Text):
    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
    Код (Text):
    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell\AddLog" /f
    Код (Text):
    echo n|reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell\AddSave"
    И т.д. вплоть до попыток прописать параметр /ve вручную...


    Так дело в том,что как раз с нужным значением и нету,см. первый пост.
    Конечно бы я не стал извращаться.
     
  9. Dragokas
    Оффлайн

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

    Сообщения:
    4.478
    Симпатии:
    4.307
    Koza Nozdri, тут понимаешь, какая странная вещь.
    Значение - оно как бы есть, но его как бы нет :)

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

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

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

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

    Код (Text):
    reg delete "%key%" /ve /f
     
    Последнее редактирование: 6 июл 2014
    Kиpилл нравится это.
  10. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    У меня нет)

    Не работает!

    Щас испытаю.


    Даже боюсь спросить как ты это вычислил.
    Я некоторое время,достаточное для небольшого нервного расстройства, думал что я тупой пока не понял что это команда Билли перемудрила.
     
  11. Dragokas
    Оффлайн

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

    Сообщения:
    4.478
    Симпатии:
    4.307
    1) Ну, первый раз хватило перезапустить обычный редактор. Ключ нашел поиском.
    Снова перезапустил редактор: ключ пропал О_о. Вот такие пироги.

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

    Т.е. это проблема именно "редактора реестра Windows."
     
  12. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    У меня 32 бита.
    Проблема то редактора - тока ОС на нее болезненно реагирует.


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

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

    Сообщения:
    4.478
    Симпатии:
    4.307
    Боюсь спросить.
    Код (Text):
    set key=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell
    прописал?

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

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    Не подумал просто,читал про это.
    Я уже срубаюсь,можешь мне дать скрипт создания через консоль vbs который создаст раздел...ну или я сам завтра.
    --- Объединённое сообщение, 2 июл 2014 ---
    Ну дак!
    Я ж не совсем еще того)

    Даже для надежности так пробовал:
    Код (Text):
    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
    --- Объединённое сообщение, 2 июл 2014, Дата первоначального сообщения: 2 июл 2014 ---
    Вот рабочий экспорт.

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

    Вложения:

    • disk-menu.7z
      Размер файла:
      291 байт
      Просмотров:
      3
    Последнее редактирование: 2 июл 2014
  15. Dragokas
    Оффлайн

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

    Сообщения:
    4.478
    Симпатии:
    4.307
    Добавил в примеры.
    --- Объединённое сообщение, 2 июл 2014, Дата первоначального сообщения: 2 июл 2014 ---
    Да, согласен. Загадочный ключ.
    После импорта, новый ключ становится виден в редакторе реестра только после его перезапуска.
     
    Kиpилл нравится это.
  16. Гимаев Наиль
    Оффлайн

    Гимаев Наиль Пользователь

    Сообщения:
    59
    Симпатии:
    98
    Раз ты уверен, что проблема при записи, то ты сможешь её увидеть через программу 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: Анализируешь последний столбец и понимаешь, что на самом деле происходит в реестре.
     
    dzu и Kиpилл нравится это.
  17. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    Гимаев Наиль, хитрец)
    По факту все банально-not fond

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

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

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

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


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

    Команда
    Код (DOS):
    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell\disk-menu"
     
    Код (DOS):
    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) либо отсутствие прав у админа в консоли...

    --- Объединённое сообщение, 3 июл 2014, Дата первоначального сообщения: 3 июл 2014 ---
    Я так понимаю с этим проблема,да?
     
    Последнее редактирование: 3 июл 2014
  18. Dragokas
    Оффлайн

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

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

    Код (Text):

    taskkill /f /im explorer.exe
    start "" explorer.exe
     
     
    Последнее редактирование: 3 июл 2014
  19. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.216
    Симпатии:
    4.978
    В том то и дело что не видит.

    перезагружал и комп,и проводник и редактор.
    Ноль реакции.
    А ты на восьмерке проверял?
     
  20. Dragokas
    Оффлайн

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

    Сообщения:
    4.478
    Симпатии:
    4.307
    Расскажи, что я должен увидеть, тогда и проверю.
    На сколько понимаю - новые пункты меню, но какого?
    Вручную ты создаешь в реестре нужные записи - работает?
     

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