关于javascript:命令行参数无效验证您正在使用的交换机

The command line argument is not valid verify the switch you are using

当用户使用javascript mailto单击表单的提交按钮时,我试图打开一个Outlook:

当我从chrome或firefox提交表单时,它可以打开,但在IE中,我得到以下错误:

命令行参数无效。请验证正在使用的开关


我真的不确定你做了多少研究,但是当你查找错误时,谷歌的第一个结果是微软的一块板,在那里它似乎被解决了:

https://support.microsoft.com/en-us/kb/312346

据我所见,您的问题与URI模式"mailto"的文件关联有关。我建议您按照链接中的步骤进行操作,并在下次彻底搜索。


Microsoft知识库文章很有用,但它只是一个解决方法:

  • 例如,如果我将默认程序更改为"mail express"(Windows 10),则在IE中单击mail to不会导致问题;电子邮件将在"mail express"中打开,并可以立即发送。
  • 但是,如果我将默认程序更改回"outlook 2016"(Windows 10),则在IE中单击mailto会导致问题:"命令行参数无效,请验证您使用的开关。"

问题:

我的mailto值来自角度,我的mailto有特殊的字符。我只能使用angular的EDOCX1(jsfiddle)重新创建这个问题。我不能用纯HTML(jsfiddle)重新创建这个问题。

解决方案:

解决方案js在这里摆弄;我的问题同样是针对角/ng-href,所以我的解决方案使用角/ng-href

在我的例子中,我的mailto-href属性值包括双引号(即'"')。双引号被转义(带反斜杠),但它们没有被编码,我需要对我的mailto值进行urlencode。这是直观的,因为href属性通常指向一个URL,并且URL需要百分比编码。

1
Mail link

当我encodeURIComponent时,只有subject值:encodeURIComponent("Subject includes \"double-quotes\"")并更新该部分。结果在这里;注意新主题中的%20和%22:

1
Mail link

音符:

我有双引号(即'"'或%22),但另一个字符可能导致此问题:我怀疑其他URL不安全字符可能导致此问题。

看起来,即使在编码之前,空间(即' '或%20)也没有造成问题。在我开始使用encodeURIComponent之后,我可能修复了可能引起问题的任何/所有其他花哨字符,即'&'或其他…)

我不确定这些参数是否有不同的要求,即,是否将subject参数与body参数或隐含的to参数区别对待。所以我用encodeURIComponent来表示subjectbody

注意不要过度编码。仅编码单独的subjectbody参数:

  • 不要编码冒号(即mailto后面的:;浏览器可能无法识别这是一个mailto链接(参见解决方案)
  • 不要对问号(即?号)或等号(即=号)进行编码;浏览器/outlook可能无法解析参数(见解决方案)。

所以当我编码时:

1
encodeURIComponent("mailto:[email protected]?subject=Subject includes "double-quotes"")

注意结果;对冒号(即%3a)和等号(%3d)编码错误。

1
"mailto%3Aperson%40place.com%3Fsubject%3DSubject%20includes%20%22double-quotes%22"

小心不要双重编码,即编码已经编码的字符串!

我将从问题中删除Java标记;我同意评论,我认为Java是不相关的。