You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义协议调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:02:38