Пакетный скрипт для изменения значения в ключе реестра для шаблонов продуктов Microsoft Office

Я хочу изменить шаблон по умолчанию для некоторых продуктов Microsoft Office на нескольких компьютерах. Все работает отлично, за исключением закрепления шаблона на стартовом экране продуктов MS Office.

Я нашел раздел реестра, чтобы закрепить их там, который сохраняет путь к шаблону, который я хочу быстро изменить с помощью пакетного файла.

Информация о закрепленном шаблоне сохраняется с двумя значениями реестра Item 1 и Item Metadata 1, а путь

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates\ADAL_5DBCF6AC9A27C96B299D94D181DD223A6B8AB341FAFC42E9CFCFA1E61E3B69A6\File MRU

Данные Item 1:

[F00000001][T01D83DF9542BD760][O00000000]*C:\Users\test\Documents\Benutzerdefinierte Office-Vorlagen\template.xltx

Данные Item Metadata 1:

<Metadata><AppSpecific><id>C:\Users\test\Documents\Benutzerdefinierte Office-Vorlagen\template.xltx</id><nm>template</nm><du>C:\Users\test\Documents\Benutzerdefinierte Office-Vorlagen\template.xltx</du></AppSpecific></Metadata>

Новые данные имеют другое имя шаблона и нуждаются в ссылке на переменную среды %username%, которая будет использоваться для сопоставления с вошедшим в систему пользователем.

Проблема здесь в том, что путь ключа, начинающийся с ADAL_, имеет случайное значение.

Я уже просмотрел несколько тем, где искали какие-то ключи реестра и удаляли их. До сих пор я могу найти ключи с помощью

reg query "HKCU\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates" /s /f "Item"

Я попытался получить вывод команды запроса, назначенной переменной среды, чтобы использовать ее в команде reg add, но не могу найти рабочий метод с циклом for /f, постоянно меняющимся путем к ключу и именем пользователя в данных.

Может ли кто-нибудь помочь мне в том, как получить короткий пакетный скрипт для этого?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующий пакетный файл должен выполнить эту задачу:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=1*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates" /s /f "Item 1" 2^>nul') do if /I "%%I" == "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Recent" set "RegKey=%%I %%J" & goto UpdateRegistry
for /F "tokens=1*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates" /s /f "File MRU" 2^>nul') do if /I "%%I" == "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Recent" set "RegKey=%%I %%J" & goto UpdateRegistry
for /F "delims = " %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates" 2^>nul ^| %SystemRoot%\System32\find.exe /I "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates\ADAL_"') do set "RegKey=%%I\File MRU" & goto UpdateRegistry
echo ERROR: No "Item 1", "File MRU" or ADAL_ subkey found in Windows registry!
exit /B
:UpdateRegistry
%SystemRoot%\System32\reg.exe ADD "%RegKey%" /f /v "Item 1" /t REG_SZ /d "[F00000001][T01D83DF9542BD760][O00000000]*%USERPROFILE%\Documents\Benutzerdefinierte Office-Vorlagen\template.xltx" >nul
%SystemRoot%\System32\reg.exe ADD "%RegKey%" /f /v "Item Metadata 1" /t REG_SZ /d "<Metadata><AppSpecific><id>%USERPROFILE%\Documents\Benutzerdefinierte Office-Vorlagen\template.xltx</id><nm>template</nm><du>%USERPROFILE%\Documents\Benutzerdefinierte Office-Vorlagen\template.xltx</du></AppSpecific></Metadata>" >nul
endlocal

Необходимо разбить первую непустую строку на две подстроки по первому символу пробела с присвоением первой подстроки (токена) переменной цикла I, а остальную часть строки следующей переменной цикла J, чтобы можно было проверить с помощью ЕСЛИ условие, выполняющее сравнение строк без учета регистра, что искомое значение реестра Item 1 соответственно ключ реестра File MRU вообще найдено первыми двумя запросами реестра.

Третий запрос реестра обрабатывает только подразделы указанного ключа без поиска значения реестра или подраздела вообще и, следовательно, всегда обрабатывает все строки вывода, которые не являются пустыми. Здесь используется НАЙТИ, чтобы убедиться, что найден правильный раздел реестра, начинающийся с ADAL_ в указанном разделе реестра.

Возможно, ключ реестра

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates

вообще не существует, потому что пользователь до сих пор не запускал Excel и не нажимал вкладку Файл (нем. Датей). Этот вариант использования приводит к сообщению об ошибке при выполнении пакетного сценария выше.

Запустите в окне командной строки следующие две команды для использования %USERPROFILE%:

reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

Прочитайте документацию Microsoft о Использование операторов перенаправления команд для объяснения 2>nul и |. Операторы перенаправления > и | должны быть экранированы символом вставки ^ в командной строке ЗА, чтобы они интерпретировались как буквальный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды ЗА, которая выполняет встроенную командную строку regfind) в отдельной команде. процесс запущен в фоновом режиме.

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

  • echo /?
  • endlocal /?
  • exit /?
  • find /?
  • for /?
  • goto /?
  • reg /?
  • reg add /?
  • reg query /?
  • set /?
  • setlocal /?

См. также одна строка с несколькими командами с использованием пакетного файла Windows для объяснения операторов & и &&.

Большое тебе спасибо. Это работает как шарм. Операторы перенаправления были недостающей частью, о которой я не знал.

Boll 04.04.2022 14:03

Другие вопросы по теме