Переменные окружения в реестре [Решено]
Цитата: Cronos от 04.04.2024, 18:09Добрый день.
Пилю себе небольшой скрипт, работающий через контекстное меню. Всё отладил, всё работает как надо, но столкнулся с небольшой проблемой.
Мне захотелось сделать его более универсальным и я поменял пути у команды, так чтобы была указана переменная окружения, то есть:
%SYSTEMDRIVE%\myicons\IconChange.cmd "%1" 3— и вот эта конструкция не работает. Причём, такая же замена с иконками в контекстном меню вполне себе прокатывает. Не работает именно в случае с командой.
Если вернуть наC:\myicons\IconChange.cmd "%1" 3— то сразу всё хорошо.У меня уже голова не соображает. В чём тут может быть проблема? Реестр точно понимает переменные окружения, но именно с командой не хочет работать.
Добрый день.
Пилю себе небольшой скрипт, работающий через контекстное меню. Всё отладил, всё работает как надо, но столкнулся с небольшой проблемой.
Мне захотелось сделать его более универсальным и я поменял пути у команды, так чтобы была указана переменная окружения, то есть:
Скопировано%SYSTEMDRIVE%\myicons\IconChange.cmd "%1" 3 — и вот эта конструкция не работает. Причём, такая же замена с иконками в контекстном меню вполне себе прокатывает. Не работает именно в случае с командой.
Если вернуть на СкопированоC:\myicons\IconChange.cmd "%1" 3 — то сразу всё хорошо.
У меня уже голова не соображает. В чём тут может быть проблема? Реестр точно понимает переменные окружения, но именно с командой не хочет работать.
Цитата: ЯR от 04.04.2024, 19:43Cronos, добрый 🖐
Вероятно, при создании параметра вы выбираете Создать ➜ строковый параметр (REG_SZ), когда как при использовании переменных окружения в путях, нужен расширяемый строковый параметр (REG_EXPAND_SZ)
UPD: а там, собственно, и выбора как такового нет: при создании раздела command, параметр По умолчанию изначально задаётся со значением REG_SZ
Cronos, добрый 🖐
Вероятно, при создании параметра вы выбираете Создать ➜ строковый параметр (REG_SZ), когда как при использовании переменных окружения в путях, нужен расширяемый строковый параметр (REG_EXPAND_SZ)
UPD: а там, собственно, и выбора как такового нет: при создании раздела command, параметр По умолчанию изначально задаётся со значением REG_SZ
Цитата: Cronos от 05.04.2024, 00:14Цитата: ЯR от 04.04.2024, 19:43Cronos, добрый
Вероятно, при создании параметра вы выбираете Создать ➜ строковый параметр (REG_SZ), когда как при использовании переменных окружения в путях, нужен расширяемый строковый параметр (REG_EXPAND_SZ)Спасибо!
Да, конечно, потому что изначально там был строковый, я просто замену потом сделал.А имя у него какое должно быть? У меня так, но не работает.
Цитата: ЯR от 04.04.2024, 19:43Cronos, добрый
Вероятно, при создании параметра вы выбираете Создать ➜ строковый параметр (REG_SZ), когда как при использовании переменных окружения в путях, нужен расширяемый строковый параметр (REG_EXPAND_SZ)
Спасибо!
Да, конечно, потому что изначально там был строковый, я просто замену потом сделал.
А имя у него какое должно быть? У меня так, но не работает.
Цитата: ЯR от 05.04.2024, 01:18Cronos, нет, в command не нужно создавать дополнительный параметр, значение нужно вписать в параметр По умолчанию ➜ пример.
Виндовый редактор реестра не умеет менять значение по умолчанию. Тут, либо изменять через командную строку, прописав REG_EXPAND_SZ:
reg add "путь к разделу реестра" /ve /t REG_EXPAND_SZ
либо менять значение в стороннем редакторе, к примеру так (в regworkshop).
Cronos, нет, в command не нужно создавать дополнительный параметр, значение нужно вписать в параметр По умолчанию ➜ пример.
Виндовый редактор реестра не умеет менять значение по умолчанию. Тут, либо изменять через командную строку, прописав REG_EXPAND_SZ:
Скопированоreg add "путь к разделу реестра" /ve /t REG_EXPAND_SZ
либо менять значение в стороннем редакторе, к примеру так (в regworkshop).
Цитата: Cronos от 05.04.2024, 02:25Цитата: ЯR от 05.04.2024, 01:18Cronos, нет, в command не нужно создавать дополнительный параметр, значение нужно вписать в параметр По умолчанию ➜ пример.
Виндовый редактор реестра не умеет менять значение по умолчанию. Тут, либо изменять через командную строку, прописав REG_EXPAND_SZ:
reg add "путь к разделу реестра" /ve /t REG_EXPAND_SZ
либо менять значение в стороннем редакторе, к примеру так (в regworkshop).Спасибо, сработало! Но в итоге это всё равно тупик. Там куча значений и всех их править займёт огромное количество времени. Я думал, что поправлю одно, а потом через экспорт посмотрю синтаксис, но там бинарное значение, то есть вообще не вариант его править с блокнота. Через командную строку тоже не выйдет. Просто заменить строковый на расширяемый строковый не меняя само значение нельзя, а если прописывать
reg add HKCR\Folder\shell\Red1\shell\Base_red\command /ve /t REG_EXPAND_SZ /d "%systemdrive%\myicons\IconChange.cmd "%1" 11"то он в значение впишет диск C:, что как бы весь смысл затеи сводит на нет. Можно, конечно, сказать, что в реальности он проставляет тот диск, который системный на данном компе, но как представлю сколько строк нужно прописать со всеми кодами,так сразу грустно.
Цитата: ЯR от 05.04.2024, 01:18Cronos, нет, в command не нужно создавать дополнительный параметр, значение нужно вписать в параметр По умолчанию ➜ пример.
Виндовый редактор реестра не умеет менять значение по умолчанию. Тут, либо изменять через командную строку, прописав REG_EXPAND_SZ:
Скопированоreg add "путь к разделу реестра" /ve /t REG_EXPAND_SZ
либо менять значение в стороннем редакторе, к примеру так (в regworkshop).
Спасибо, сработало! Но в итоге это всё равно тупик. Там куча значений и всех их править займёт огромное количество времени. Я думал, что поправлю одно, а потом через экспорт посмотрю синтаксис, но там бинарное значение, то есть вообще не вариант его править с блокнота. Через командную строку тоже не выйдет. Просто заменить строковый на расширяемый строковый не меняя само значение нельзя, а если прописывать Скопированоreg add HKCR\Folder\shell\Red1\shell\Base_red\command /ve /t REG_EXPAND_SZ /d "%systemdrive%\myicons\IconChange.cmd "%1" 11" то он в значение впишет диск C:, что как бы весь смысл затеи сводит на нет. Можно, конечно, сказать, что в реальности он проставляет тот диск, который системный на данном компе, но как представлю сколько строк нужно прописать со всеми кодами,так сразу грустно.
Цитата: ЯR от 05.04.2024, 10:23Cronos, вы писали, что у вас уже есть готовый скрипт и произвести замену на нужные значения будет не так сложно. Да, придётся покорпеть над сценарием, но большинство рутинных действий по замене, можно переложить на нормальный текстовый редактор, типа Notepad++. Делать это через обычный Блокнот — это боль.
Cronos, вы писали, что у вас уже есть готовый скрипт и произвести замену на нужные значения будет не так сложно. Да, придётся покорпеть над сценарием, но большинство рутинных действий по замене, можно переложить на нормальный текстовый редактор, типа Notepad++. Делать это через обычный Блокнот — это боль.
Цитата: Cronos от 05.04.2024, 12:44Цитата: ЯR от 05.04.2024, 10:23Cronos, вы писали, что у вас уже есть готовый скрипт и произвести замену на нужные значения будет не так сложно. Да, придётся покорпеть над сценарием, но большинство рутинных действий по замене, можно переложить на нормальный текстовый редактор, типа Notepad++. Делать это через обычный Блокнот — это боль.
Яр, тут проблема в следующем: у меня есть уже готовые ветки, которые я выгрузил из реестра.
Выглядит вот так примерно:[spoiler title=""]
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Base_red]
"MUIVerb"="Base_red"
"Icon"="%systemdrive%\\myicons\\FolderIcons.dll,3"[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Base_red\command]
@="%systemdrive%\\myicons\\IconChange.cmd \"%1\" 3"[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Folder_red]
"MUIVerb"="Folder_red"
"Icon"="%systemdrive%\\myicons\\FolderIcons.dll,7"[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Folder_red\command]
@="%systemdrive%\\myicons\\IconChange.cmd \"%1\" 7"и так далее и тому подобное
[/spoiler]А если делать через замену параметра, то получаем.
[spoiler title=""]
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Base_red\command]
@=hex(2):43,00,3a,00,5c,00,6d,00,79,00,69,00,63,00,6f,00,6e,00,73,00,5c,00,49,\
00,63,00,6f,00,6e,00,43,00,68,00,61,00,6e,00,67,00,65,00,2e,00,63,00,6d,00,\
64,00,20,00,25,00,31,00,20,00,31,00,31,00,00,00[/spoiler]
Как вы понимаете, тут я уже не смогу ничего редактировать. Вот нужно мне цифру 3 в конце параметра на 7 поменять и как? В бинарнике я этого сделать не смогу, по понятной причине.
Если делать через батник, то мне нужно такой батник создать, а потом в нём в каждой строке сделать нужные замены.А меняется у меня как адрес, так и значения параметра, которые я передаю в батник.
Проблема в том, что изначальные значения я вносил через reg файл, а там другой синтаксис. То есть просто копировать не выйдет. Нужно их с нуля прописывать. Если бы я сразу с батника начал, то тогда да, нужно бы было просто чутка поменять команду по вашему примеру. А так нужно с нуля переписать всё.
Я ведь как поступил: написал первую ветку. Эскпортировал. А потом через Notepad++ скопировал строки и сделал нужные замены. Потом добавил обратно в реестр.Я изначально не подозревал, что у майков так криво это организовано. Думал там просто заменить С: на %systemdrive%. А оказалось вон оно чё. Так ещё и вид бинарный, что совсем Ж.
Цитата: ЯR от 05.04.2024, 10:23Cronos, вы писали, что у вас уже есть готовый скрипт и произвести замену на нужные значения будет не так сложно. Да, придётся покорпеть над сценарием, но большинство рутинных действий по замене, можно переложить на нормальный текстовый редактор, типа Notepad++. Делать это через обычный Блокнот — это боль.
Яр, тут проблема в следующем: у меня есть уже готовые ветки, которые я выгрузил из реестра.
Выглядит вот так примерно:
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Base_red]
"MUIVerb"="Base_red"
"Icon"="%systemdrive%\\myicons\\FolderIcons.dll,3"
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Base_red\command]
@="%systemdrive%\\myicons\\IconChange.cmd \"%1\" 3"
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Folder_red]
"MUIVerb"="Folder_red"
"Icon"="%systemdrive%\\myicons\\FolderIcons.dll,7"
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Folder_red\command]
@="%systemdrive%\\myicons\\IconChange.cmd \"%1\" 7"
и так далее и тому подобное
А если делать через замену параметра, то получаем.
[HKEY_CLASSES_ROOT\Folder\shell\Red1\shell\Base_red\command]
@=hex(2):43,00,3a,00,5c,00,6d,00,79,00,69,00,63,00,6f,00,6e,00,73,00,5c,00,49,\
00,63,00,6f,00,6e,00,43,00,68,00,61,00,6e,00,67,00,65,00,2e,00,63,00,6d,00,\
64,00,20,00,25,00,31,00,20,00,31,00,31,00,00,00
Как вы понимаете, тут я уже не смогу ничего редактировать. Вот нужно мне цифру 3 в конце параметра на 7 поменять и как? В бинарнике я этого сделать не смогу, по понятной причине.
Если делать через батник, то мне нужно такой батник создать, а потом в нём в каждой строке сделать нужные замены.А меняется у меня как адрес, так и значения параметра, которые я передаю в батник.
Проблема в том, что изначальные значения я вносил через reg файл, а там другой синтаксис. То есть просто копировать не выйдет. Нужно их с нуля прописывать. Если бы я сразу с батника начал, то тогда да, нужно бы было просто чутка поменять команду по вашему примеру. А так нужно с нуля переписать всё.
Я ведь как поступил: написал первую ветку. Эскпортировал. А потом через Notepad++ скопировал строки и сделал нужные замены. Потом добавил обратно в реестр.
Я изначально не подозревал, что у майков так криво это организовано. Думал там просто заменить С: на %systemdrive%. А оказалось вон оно чё. Так ещё и вид бинарный, что совсем Ж.
Цитата: ЯR от 05.04.2024, 13:54Cronos, ну, речь ведь изначально шла про смену типа значений ➜ REG_SZ vs REG_EXPAND_SZ, а не точечной смене ключика с 3 на 7.
Если у вас уже есть готовый выгруженный куст реестра, то для быстрой конвертации из reg в bat, советую использовать утилиту RegConvert. Она, в том числе, понимает экспортированный шестнадцатеричный файл реестра, так что выгруженный в hex-формате куст тоже будет принят утилитой. Просто указываете ему файл реестра и жмёте Конвертировать. После этого пропускаете полученное через Notepad++ и производите замену на REG_EXPAND_SZ. В итоге, у вас получится готовый к применению батник. Только, перед экспортом данных из реестра, убедитесь в том, что значения параметров введены согласно синтаксису — вижу, у вас отсутствуют кавычки в некоторых местах.
Надеюсь, это немного облегчит переход и настройку.
Cronos, ну, речь ведь изначально шла про смену типа значений ➜ REG_SZ vs REG_EXPAND_SZ, а не точечной смене ключика с 3 на 7.
Если у вас уже есть готовый выгруженный куст реестра, то для быстрой конвертации из reg в bat, советую использовать утилиту RegConvert. Она, в том числе, понимает экспортированный шестнадцатеричный файл реестра, так что выгруженный в hex-формате куст тоже будет принят утилитой. Просто указываете ему файл реестра и жмёте Конвертировать. После этого пропускаете полученное через Notepad++ и производите замену на REG_EXPAND_SZ. В итоге, у вас получится готовый к применению батник. Только, перед экспортом данных из реестра, убедитесь в том, что значения параметров введены согласно синтаксису — вижу, у вас отсутствуют кавычки в некоторых местах.
Надеюсь, это немного облегчит переход и настройку.
Цитата: Cronos от 05.04.2024, 23:40Цитата: ЯR от 05.04.2024, 13:54Cronos, ну, речь ведь изначально шла про смену типа значений ➜ REG_SZ vs REG_EXPAND_SZ, а не точечной смене ключика с 3 на 7.
Если у вас уже есть готовый выгруженный куст реестра, то для быстрой конвертации из reg в bat, советую использовать утилиту RegConvert. Она, в том числе, понимает экспортированный шестнадцатеричный файл реестра, так что выгруженный в hex-формате куст тоже будет принят утилитой. Просто указываете ему файл реестра и жмёте Конвертировать. После этого пропускаете полученное через Notepad++ и производите замену на REG_EXPAND_SZ. В итоге, у вас получится готовый к применению батник. Только, перед экспортом данных из реестра, убедитесь в том, что значения параметров введены согласно синтаксису — вижу, у вас отсутствуют кавычки в некоторых местах.
Надеюсь, это немного облегчит переход и настройку.О, спасибо! Не знал что есть такая прога. Попробую применить. Звучит не сложно, если я всё правильно понял. Это должно решить проблему.
Не, изначально речь шла про замену C: на %systemdrive% это уже потом начали всплывать нюансы 🙂 Если бы у майков не было столько ненужных ограничений, то даже бы вопрос не возник. Это сейчас я уже понимаю, что нужно было с батника начинать, но кто ж знал?
Кавычки? Это вы про выгрузку из реестра? Не, она рабочая, я проверял. Я скопировал кусок из reg файла as is. Если бы там были ошибки, то оно бы не работало просто. Или про строку батника? Там пробелов нет, поэтому она тоже работает. Если бы были пробелы в адресе, тогда да, кавычки явно пропущены. Но там в любом случае за меня всё сделает конвертер, так что ошибок не должно быть.
В общем, спасибо ещё раз. Буду пробовать.
Цитата: ЯR от 05.04.2024, 13:54Cronos, ну, речь ведь изначально шла про смену типа значений ➜ REG_SZ vs REG_EXPAND_SZ, а не точечной смене ключика с 3 на 7.
Если у вас уже есть готовый выгруженный куст реестра, то для быстрой конвертации из reg в bat, советую использовать утилиту RegConvert. Она, в том числе, понимает экспортированный шестнадцатеричный файл реестра, так что выгруженный в hex-формате куст тоже будет принят утилитой. Просто указываете ему файл реестра и жмёте Конвертировать. После этого пропускаете полученное через Notepad++ и производите замену на REG_EXPAND_SZ. В итоге, у вас получится готовый к применению батник. Только, перед экспортом данных из реестра, убедитесь в том, что значения параметров введены согласно синтаксису — вижу, у вас отсутствуют кавычки в некоторых местах.
Надеюсь, это немного облегчит переход и настройку.
О, спасибо! Не знал что есть такая прога. Попробую применить. Звучит не сложно, если я всё правильно понял. Это должно решить проблему.
Не, изначально речь шла про замену C: на %systemdrive% это уже потом начали всплывать нюансы 🙂 Если бы у майков не было столько ненужных ограничений, то даже бы вопрос не возник. Это сейчас я уже понимаю, что нужно было с батника начинать, но кто ж знал?
Кавычки? Это вы про выгрузку из реестра? Не, она рабочая, я проверял. Я скопировал кусок из reg файла as is. Если бы там были ошибки, то оно бы не работало просто. Или про строку батника? Там пробелов нет, поэтому она тоже работает. Если бы были пробелы в адресе, тогда да, кавычки явно пропущены. Но там в любом случае за меня всё сделает конвертер, так что ошибок не должно быть.
В общем, спасибо ещё раз. Буду пробовать.
Цитата: Cronos от 08.04.2024, 13:46Всё супер. Ещё раз спасибо!
У меня получилось сделать так, чтобы всё работало.
Всё супер. Ещё раз спасибо!
У меня получилось сделать так, чтобы всё работало.
Цитата: Cronos от 08.04.2024, 21:59@yar, привет! Извини, что беспокою, но не в курсе с чем может быть связана такое вот поведение системы: если изменить иконку через свойства, то всё подхватывается мгновенно. Если делать это через создание desktop.ini, то существует довольно большая задержка между созданием файла и сменой иконки. Причём, не могу найти зависимость что на это влияет. Обновление не всегда помогает. Иногда помогает перемещение измененной папки в другую папку и обратно. Иногда просто со временем само меняется (точнее оно всегда со временем меняется рано или поздно). Хотелось бы знать можно ли как-то это ускорить?
@yar, привет! Извини, что беспокою, но не в курсе с чем может быть связана такое вот поведение системы: если изменить иконку через свойства, то всё подхватывается мгновенно. Если делать это через создание desktop.ini, то существует довольно большая задержка между созданием файла и сменой иконки. Причём, не могу найти зависимость что на это влияет. Обновление не всегда помогает. Иногда помогает перемещение измененной папки в другую папку и обратно. Иногда просто со временем само меняется (точнее оно всегда со временем меняется рано или поздно). Хотелось бы знать можно ли как-то это ускорить?
Цитата: ЯR от 08.04.2024, 22:39Cronos, привет 🖐
Тут дело в атрибуте папки, чтобы изменения применялись сразу, нужно установить атрибут "Только для чтения".
Cronos, привет 🖐
Тут дело в атрибуте папки, чтобы изменения применялись сразу, нужно установить атрибут "Только для чтения".
Цитата: Cronos от 08.04.2024, 22:57Цитата: ЯR от 08.04.2024, 22:39Cronos, привет
Тут дело в атрибуте папки, чтобы изменения применялись сразу, нужно установить атрибут "Только для чтения".Устанавливаю. Создаю файл desktop.ini, потом применяю
attrib +R "имя папки". Всё так же. Аттрибут реально меняется, я через консоль проверял.
Более того, если в папке уже что-то есть, то чтобы она сменила значок её нужно в другую папку засунуть. Иначе она так и остаётся стандартной. Ещё работает переименование папки. Тоже сразу меняет значок.
Цитата: ЯR от 08.04.2024, 22:39Cronos, привет
Тут дело в атрибуте папки, чтобы изменения применялись сразу, нужно установить атрибут "Только для чтения".
Устанавливаю. Создаю файл desktop.ini, потом применяю Скопированоattrib +R "имя папки". Всё так же. Аттрибут реально меняется, я через консоль проверял.
Более того, если в папке уже что-то есть, то чтобы она сменила значок её нужно в другую папку засунуть. Иначе она так и остаётся стандартной. Ещё работает переименование папки. Тоже сразу меняет значок.
Цитата: ЯR от 09.04.2024, 08:09Cronos, измени порядок:
• создаём папку
• меняем атрибут на "Только для чтения"
• создаём desktop.ini с таким содержимым:[.ShellClassInfo] IconFile=ПУТЬ_К_ИКОНКЕ.ico IconIndex=0В таком порядке должно работать.
Cronos, измени порядок:
• создаём папку
• меняем атрибут на "Только для чтения"
• создаём desktop.ini с таким содержимым:
[.ShellClassInfo] IconFile=ПУТЬ_К_ИКОНКЕ.ico IconIndex=0
В таком порядке должно работать.