我正在尝试创建一个批处理脚本,该脚本将重现我手动创建的注册表中的条目。该脚本将成为我正在开发的小型 WEB 应用程序的安装过程的一部分。
注册表中所需的条目实际上是从 JavaScript 调用的自定义协议的定义,以激活外部进程(在本例中为 PowerShell 脚本)。
手动生成的条目如以下快照所示,它可以根据需要工作:
到目前为止,我的脚本正确地复制了显示的条目,除了最后一个(
command
部分)抱怨语法错误。这是尝试注册定义的最后部分并触发错误消息的脚本片段:
set scriptpath=%~dp0
reg query HKCR\fddmyalbs2\shell\open\command
set Query_Result=%errorlevel%
if "%Query_Result%"=="0" (
echo "HKCR\fddmyalbs2\shell\open\command OK!"
) else (
echo "HKCR\fddmyalbs2\shell\open\command missing. Registering..."
reg add HKCR\fddmyalbs2\shell\open\command /t REG_SZ /d "powershell.exe" %scriptpath%FD_Albums_MNGR.ps1 "^%1" /f
)
任何人都可以识别语法错误是什么(在
reg add
命令中)吗?
谢谢。
整个事情可以通过单行批处理文件来实现:
@%SystemRoot%\System32\reg.exe Query "HKCU\SOFTWARE\Classes\fdmyalbs\shell\open\command" 1>NUL 2>&1 && (Echo HKCU\SOFTWARE\Classes\fdmyalbs\shell\open\command OK!& %SystemRoot%\System32\timeout.exe /T 3 /NoBreak 1>NUL) || (Echo HKCU\SOFTWARE\Classes\fdmyalbs\shell\open\command missing. Registering...& %SystemRoot%\System32\reg.exe Add "HKCU\SOFTWARE\Classes\fdmyalbs\shell\open\command" /VE /D "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File \"%~dp0MyAlbums\FD_Albums_MNGR.ps1\" \"%%~1\"" 1>NUL)
请注意,这使用注册表编辑器映像中的信息,而不是批处理文件中的修改信息(与该信息不匹配)。请不要更改注册表根键和子键,我提供的都是正确的,(您不应该使用
HKCR
根键,它本质上是 HKLM\SOFTWARE\Classes
和 HKCU\SOFTWARE\Classes
的合并视图) 。如果这确实适用于计算机的所有用户,您可以将 HKCU
的所有实例替换为 HKLM
,但请注意,必须以提升的权限运行脚本。此外,我还改进了您的 PowerShell 命令,因此我建议您也不要管它。
如果您希望它更具可读性,那么您可以将行分成几行:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "RegKey=HKCU\SOFTWARE\Classes\fdmyalbs\shell\open\command"
%SystemRoot%\System32\reg.exe Query "%RegKey%" 1>NUL 2>&1 && (
Echo %RegKey% OK!
%SystemRoot%\System32\timeout.exe /T 3 /NoBreak 1>NUL
) || (Echo %RegKey% missing. Registering...
%SystemRoot%\System32\reg.exe Add "%RegKey%" /VE /D "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File \"%~dp0MyAlbums\FD_Albums_MNGR.ps1\" \"%%~1\"" 1>NUL
)