如何在MSHTA JavaScript中转义双引号及处理带空格参数
批处理脚本中含空格/需引号包裹的参数写法问题
以下是原始的批处理脚本示例,其中部分参数写法可正常运行,带空格的参数写法则失效:
@echo off set "shell=new ActiveXObject('shell.application').ShellExecute" :: 可正常运行的示例 set "arg1=cmd.exe"& set "arg2=/k title Command Prompt" set "arg1=cmd.exe"& set "arg2=/c C:\Temp\test4.bat" set "arg1=wt.exe"& set "arg2=-p PowerShell" :: 无法运行的示例(已注释) ::set "arg1=cmd.exe"& set "arg2=/c ^"C:\Temp\test 4.bat^"" ::set "arg1=wt.exe"& set "arg2=-p ^"Command Prompt^" cmd.exe" MSHTA "javascript: %shell%('%arg1%', '%arg2%', '', 'runas', 1); close();"
当arg2包含空格或需要用双引号包裹时,以下几种写法均无法正常运行:
set "arg1=cmd.exe"& set "arg2=/c ^"C:\Temp\test 4.bat^"" set "arg1=cmd.exe"& set "arg2=/c start \"Command Prompt\"" set "arg1=wt.exe"& set "arg2=-p ^"Command Prompt^" cmd.exe" -p \"Command Prompt\" cmd.exe -p ""Command Prompt""
正确写法及原理
1. 调用带空格路径的批处理文件(cmd.exe /c 场景)
直接在arg2中使用\"作为双引号的转义符——因为最终参数会传递给JavaScript执行,JS中需要用\"表示字符串内的双引号:
set "arg1=cmd.exe"& set "arg2=/c \"C:\Temp\test 4.bat\""
2. Windows Terminal 指定带空格的配置文件(wt.exe -p 场景)
同样使用\"转义双引号,确保JS能正确解析带空格的配置名称:
set "arg1=wt.exe"& set "arg2=-p \"Command Prompt\" cmd.exe"
更可靠的延迟扩展写法
如果经常遇到转义混乱的问题,推荐启用批处理的延迟扩展,避免变量展开时的转义冲突:
@echo off setlocal enabledelayedexpansion set "shell=new ActiveXObject('shell.application').ShellExecute" :: 调用带空格的批处理 set "arg1=cmd.exe" set "arg2=/c \"C:\Temp\test 4.bat\"" MSHTA "javascript: !shell!('!arg1!', '!arg2!', '', 'runas', 1); close();" :: 调用带空格配置的Windows Terminal set "arg1=wt.exe" set "arg2=-p \"Command Prompt\" cmd.exe" MSHTA "javascript: !shell!('!arg1!', '!arg2!', '', 'runas', 1); close();" endlocal
核心逻辑
因为MSHTA执行的是JavaScript代码,ShellExecute的第二个参数是字符串类型,所以参数内的双引号必须符合JS的字符串转义规则(用\")。而批处理的set "var=value"语法会原样保留引号内的内容,因此直接写入\"即可,无需额外添加批处理转义符^。
内容的提问来源于stack exchange,提问作者Oprex Droid
相关产品推荐
相关产品推荐

