自定义协议调用PowerShell时,encodeURI处理的JSON逗号被替换问题
问题原因与解决方案
为什么逗号会被拆分显示?
这是因为Windows Shell处理自定义协议URL时,会把逗号当作命令行参数的分隔符,导致原本的单个JSON字符串被拆成多个参数传给PowerShell。而你使用的encodeURI不会编码逗号(它属于URL合法保留字符),所以逗号在传递过程中直接暴露给Shell解析,触发了参数拆分,最终在PowerShell控制台里表现为换行显示(本质是多个参数分别输出)。
正确解决方案
不要用encodeURI编码整个URL,改用encodeURIComponent单独编码JSON字符串部分——它会转义包括逗号在内的所有特殊字符,避免被Shell当作分隔符拆分。
修改后的JavaScript代码:
var l_Request_JSON_Str = '{"Request":"Do_1","Par_1":"blabla"}' ; // 仅编码JSON参数,而非整个URL var l_Test_URL = 'MyProt: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() ;
生成的URL中,逗号会被编码为%2C,示例如下:
fdmyalbs:MyApp?Command=%7B%22Request%22%3A%22Get_Albums_List%22%2C%22Folder%22%3A%22blablaFolder%22%7D
在PowerShell脚本中,只需对接收的参数进行URL解码即可还原完整JSON:
# 解码参数(假设参数在$args[0]中) $decodedJson = [Uri]::UnescapeDataString($args[0]) # 或者使用System.Web.HttpUtility(需加载程序集) # Add-Type -AssemblyName System.Web # $decodedJson = [System.Web.HttpUtility]::UrlDecode($args[0])
这样就不需要用@@@替换的临时方案,流程更简洁可靠。
内容的提问来源于stack exchange,提问作者FDavidov
相关产品推荐
相关产品推荐

