用于更改 Microsoft Office 产品模板的注册表项中的值的批处理脚本

Batch script to change a value in a registry key for templates of Microsoft Office products

我想在一堆计算机上更改某些 Microsoft Office 产品的默认模板。除了要固定在 MS Office 产品的开始屏幕上的模板外,一切都运行良好。

我找到了将它们固定在那里的注册表项,它保存了我想用批处理文件快速更改的模板的路径。

关于固定模板的信息使用两个注册表值Item 1Item Metadata 1保存,路径为

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office.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_开头的key的路径有一个随机值

我已经查找了一些线程,其中搜索了一些注册表项并将其删除。到目前为止,我能够找到

的密钥
reg query "HKCU\SOFTWARE\Microsoft\Office.0\Excel\Recent Templates" /s /f "Item"

我试图获取分配给环境变量的查询命令的输出,以便在 reg add 命令中使用它,但找不到带有 for /f 循环的工作方法,总是更改数据中的密钥路径和用户名。

有人可以帮助我了解如何获得一个简短的批处理脚本来执行此操作吗?

以下批处理文件应该完成任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=1*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\SOFTWARE\Microsoft\Office.0\Excel\Recent Templates" /s /f "Item 1" 2^>nul') do if /I "%%I" == "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office.0\Excel\Recent" set "RegKey=%%I %%J" & goto UpdateRegistry
for /F "tokens=1*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\SOFTWARE\Microsoft\Office.0\Excel\Recent Templates" /s /f "File MRU" 2^>nul') do if /I "%%I" == "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office.0\Excel\Recent" set "RegKey=%%I %%J" & goto UpdateRegistry
for /F "delims=" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\SOFTWARE\Microsoft\Office.0\Excel\Recent Templates" 2^>nul ^| %SystemRoot%\System32\find.exe /I "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office.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

有必要在第一个 space 字符上将第一个 non-empty 行拆分为两个子字符串,并将第一个子字符串(标记)分配给循环变量 I 和其余的下一个循环变量 J 的行能够用 IF 条件进行验证,分别对搜索到的注册表值 Item 1 进行 case-insensitive 字符串比较前两个注册表查询完全找到了注册表项 File MRU

第三个注册表查询只处理指定键的子键,根本不搜索注册表值或子键,因此始终处理不为空的整个输出行。这里使用 FIND 来确保在指定的注册表项中找到以 ADAL_ 开头的正确注册表项。

可能是注册表项

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office.0\Excel\Recent Templates

根本不存在,因为用户尚未启动 Excel 并单击选项卡 文件(德语:Datei) 到现在。此用例导致执行上述批处理脚本时出现错误消息。

运行 在命令提示符下 window 以下两个命令使用 %USERPROFILE%:

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

阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul| 的解释。重定向运算符 >| 必须在 FOR 命令行上使用脱字符 ^ 进行转义,以便在 [=98= 时将其解释为文字字符] 命令解释器在执行命令 FOR 之前处理此命令行,该命令在后台启动的单独命令进程中执行嵌入式 reg 命令行(带有 find)。

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

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

有关运算符 &&& 的解释,另请参阅 single line with multiple commands using Windows batch file