对于需要执行 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\...
(添加空格)对于两种协议产生相同的结果。
问题是:为什么脚本生成的协议不起作用,而在检查它们的定义时,除了协议名称之外,它们似乎是相同的。
谢谢。
问题似乎可能与协议在注册表中的注册方式有关。让我们完成一些故障排除步骤:
检查PowerShell脚本执行情况: 确保您的 PowerShell 脚本正确执行。您可以通过从 PowerShell 控制台运行它来单独测试它。确保它可以在特定文件夹中创建所需的文本文件。
检查协议名称: 验证脚本 (fddmyalbs2) 生成的协议名称中没有拼写错误或意外字符。确保它与您的 JavaScript 代码中使用的内容完全匹配。
命令注册中的引用: 在您的批处理脚本中,命令注册行是:
批次 复制代码 reg 添加 HKEY_LOCAL_MACHINE\SOFTWARE\Classes ddmyalbs2\shell\ope