|
|
发表于 2026-3-20 20:41:49
|
显示全部楼层
本帖最后由 redyear2026 于 2026-3-21 18:16 编辑
在批处脚本中,mshta 代码落入圆括号这类复合语块里,据说会有一个 '禁则',即不能出现嵌套双引号或嵌套单引号,一个简单解法是用 call 方法解围,如下示例
- @echo off
- if exist "%SystemRoot%\System32\mshta.exe" (
- call :toMSHTA
- )
- exit/b
- :toMSHTA
- Start "" /min mshta.exe VBScript:Execute("Set
- WshShell=CreateObject(""WScript.Shell""):Set
- Shortcut=WshShell.CreateShortcut(WshShell.SpecialFolders(""Desktop"")
- &
- ""\Notepad++.lnk""):Shortcut.TargetPath=""%~dp0Notepad++.exe"":Shortcut.WorkingDirectory=""%~dp0"":Shortcut.Save:close")
- exit/b
复制代码 三重语境 bat+vbs+mshta 会使 vbs 处理双引号 '雪上加霜',而用 jscript 平替 vbs 会轻松得多,虽然也要对路径分隔符 \ 倍加呵护,但很容易在复合语块中走通,见下例
- @echo off & set "tp=%~dp0Notepad++.exe" & set "wd=%~dp0"
- if exist "%SystemRoot%\System32\mshta.exe" (
- start "" /min mshta "javaScript:ws=new ActiveXObject('WScript.Shell'),lnk=ws.CreateShortcut(ws.SpecialFolders('Desktop')+'\\Notepad++.lnk'),lnk.TargetPath='%tp:\=\\%',lnk.workingDirectory='%wd:\=\\%',lnk.Save(),close()"
- )
- exit/b
复制代码
|
|