Windows-10 脚本将自定义协议定义到注册表中

问题描述 投票:0回答:1

对于需要执行 PowerShell 脚本的 Web 应用程序,我正在编写一个脚本,该脚本将在注册表中定义所需的自定义协议条目。

我有一个手动生成的工作协议定义,它可以根据需要工作。当测试将生成等效条目(当然具有不同名称)的脚本时,该脚本通过了所有语法检查,但是当从应用程序调用时,它不会产生所需的结果(这将是一个新的文本文件到一个特定文件夹,调用手动创建的协议时效果非常好的功能)。

应用程序 JavaScript 中的调用是:

:
:
// var l_Test_URL = 'fddmyalbs2:MyApp?Command=' + encodeURIComponent(l_Request_JSON_Str) ;
var l_Test_URL = 'fdmyalbs:MyApp?Command=' + encodeURIComponent(l_Request_JSON_Str) ;


var l_Tempo_Element       = document.createElement("a") ;
l_Tempo_Element.setAttribute    ("id"   , "Invoke_Custom_Prototol"           ) ;
l_Tempo_Element.setAttribute    ("href" , l_Test_URL                         ) ;
l_Tempo_Element.addEventListener("click", function (e) { e.stopPropagation()}) ;

l_Tempo_Element.click() ;

l_Tempo_Element.remove() ;
:
:

在上面,名称

fdmyalbs
代表手动创建的协议,可以按预期工作,而
fddmyalbs2
代表由脚本生成的协议,但无法工作。

定义自定义协议的批处理脚本是:

@ECHO OFF

SETLOCAL 

    set scriptpath=%~dp0

    set ScriptFullPath=%scriptpath%FD_Albums_MNGR.ps1
    
    REM Exit script if the "command" part of the protocol definition is present...
    REM --------------------------------------------------------------------------
        reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open\command > null
    
        set Query_Result=%errorlevel%
    
        if "%Query_Result%"=="0" (
            echo.
            echo Custom Protocol appears to be well defined. Terminating script...
            echo.
            goto:EOF
        )

echo.
echo.
echo "Verifying/Complete Custom Protocol definition into Registry...

REM
REM Custom Prodocol check and (if needed) definition...
REM ===================================================
REM Checking Protocol Name...
    
    reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2 > null
    
    set Query_Result=%errorlevel%
    
    if "%Query_Result%"=="0" (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2 OK!"
    ) else (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2 missing. Registering..."
        reg add HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2 /t REG_SZ /d "FDAlbums Files Managment" /f
        reg add HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2 /v "URL Protocol" /t REG_SZ /d "" /f

    )

echo.
echo.

REM Checking shell...
    
    reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell > null
    
    set Query_Result=%errorlevel%
    
    if "%Query_Result%"=="0" (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell OK!"
    ) else (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell missing. Registering..."
        reg add HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell /t REG_SZ /f
    )

echo.
echo.

REM Checking open...

    reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open > null
    
    set Query_Result=%errorlevel%
    
    if "%Query_Result%"=="0" (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open OK!"
    ) else (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open missing. Registering..."
        reg add HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open /t REG_SZ /f
    )

echo.
echo.

REM Checking command...

    reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open\command > null
    
    set Query_Result=%errorlevel%
    
    if "%Query_Result%"=="0" (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open\command OK!"
    ) else (
        echo "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open\command missing. Registering..."
        reg add HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open\command /t REG_SZ /d "powershell.exe\"%ScriptFullPath%FD_Albums_MNGR.ps1\" \"%%~1\""
    )
    

ENDLOCAL
ECHO ON

我应该注意到,我必须通过

reg add
应用程序手动更改最后一个
Register Editor
命令的结果,因为它的最后一部分不是作为手动生成的协议生成的,而该协议再次完成了这项工作。不同的是代表传递参数的那一块不一样(应该是
"%1"
)。

最后,这是两个协议的命令

For %G In (LM CU) Do @%SystemRoot%\System32\reg.exe Query "HK%G\SOFTWARE\Classes\<protocol-name>" /S 2>NUL
的结果。

C:\>For %G In (LM CU) Do @%SystemRoot%\System32\reg.exe Query "HK%G\SOFTWARE\Classes\fdmyalbs" /S 2>NUL

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fdmyalbs
    (Default)    REG_SZ    FDAlbums Files Managment
    URL Protocol    REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fdmyalbs\shell
    (Default)    REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fdmyalbs\shell\open
    (Default)    REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fdmyalbs\shell\open\command
    (Default)    REG_SZ    "powershell.exe"c:\D_Disk\MyAlbums\FD_Albums_MNGR.ps1 "%1"


C:\>For %G In (LM CU) Do @%SystemRoot%\System32\reg.exe Query "HK%G\SOFTWARE\Classes\fddmyalbs2" /S 2>NUL

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2
    (Default)    REG_SZ    FDAlbums Files Managment
    URL Protocol    REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell
    (Default)    REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open
    (Default)    REG_SZ

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\fddmyalbs2\shell\open\command
    (Default)    REG_SZ    "powershell.exe"c:\D_Disk\MyAlbums\FD_Albums_MNGR.ps1 "%1"

注意:

"powershell.exe"c:\D_Disk\MyAlbums\...
"powershell.exe" c:\D_Disk\MyAlbums\...
(添加空格)对于两种协议产生相同的结果。

问题是:为什么脚本生成的协议不起作用,而在检查它们的定义时,除了协议名称之外,它们似乎是相同的。

谢谢。

windows-10 registry custom-protocol
1个回答
0
投票

问题似乎可能与协议在注册表中的注册方式有关。让我们完成一些故障排除步骤:

检查PowerShell脚本执行情况: 确保您的 PowerShell 脚本正确执行。您可以通过从 PowerShell 控制台运行它来单独测试它。确保它可以在特定文件夹中创建所需的文本文件。

检查协议名称: 验证脚本 (fddmyalbs2) 生成的协议名称中没有拼写错误或意外字符。确保它与您的 JavaScript 代码中使用的内容完全匹配。

命令注册中的引用: 在您的批处理脚本中,命令注册行是:

批次 复制代码 reg 添加 HKEY_LOCAL_MACHINE\SOFTWARE\Classes ddmyalbs2\shell\ope

© www.soinside.com 2019 - 2024. All rights reserved.