我想更改许多计算机上某些 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
循环、始终变化的关键路径和用户名的工作方法数据中。
有人可以帮助我如何获得一个简短的批处理脚本来执行此操作吗?
以下批处理文件应该完成该任务:
@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
,以便能够使用 IF 条件进行不区分大小写的字符串比较,验证前两个注册表查询是否找到了搜索到的注册表值 Item 1
和注册表项 File MRU
。
第三个注册表查询仅处理指定项的子项,根本不搜索注册表值或子项,因此始终处理不为空的整个输出行。这里使用 FIND 来确保在指定的注册表项中找到以
ADAL_
开头的正确注册表项。
有可能是注册表项
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\Recent Templates
根本不存在,因为用户到目前为止尚未启动 Excel 并单击选项卡 File(德语:Datei)。此用例会导致执行上述批处理脚本时出现错误消息。
出于使用
%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
和 |
的说明。重定向运算符 >
和 |
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的 )之前处理此命令行时将其解释为文字字符reg
命令行(带有 find
),使用在后台启动的单独命令进程。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
exit /?
find /?
for /?
goto /?
reg /?
reg add /?
reg query /?
set /?
setlocal /?
另请参阅 使用 Windows 批处理文件的单行多个命令,了解运算符
&
和 &&
的说明。