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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:15:12