找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1237|回复: 24

[求助] 在批处理脚本中嵌套使用mshta创建快捷方式出错

[复制链接]
发表于 2026-3-19 21:26:04 | 显示全部楼层 |阅读模式
因为新版本的系统的mshta组件被移除,所以大量使用mshta的脚本需要更新。

在此过程中,遇到了嵌套使用mshta的情况下,虽然成功地创建快捷方式,但是mshta提示缺少右括号(不嵌套,该指令单独一行时运行正常)。
在保持嵌套的情况下,这段代码有什么办法修复吗?
  1. IF /i "%WinPE%" EQU "1" (
  2.         PECMD.exe LINK %Desktop%\NotePad++,%CD%\Notepad++.exe,,%CD%\Notepad++.exe#0
  3. ) ELSE (
  4.         IF EXIST "%SystemRoot%\System32\mshta.exe" (
  5.                 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")
  6.                 Start "" /min mshta.exe VBScript:Execute("Set WshShell=CreateObject(""WScript.Shell""):Set Shortcut=WshShell.CreateShortcut(WshShell.SpecialFolders(""Programs"") & ""\Notepad++.lnk""):Shortcut.TargetPath=""%~dp0Notepad++.exe"":Shortcut.WorkingDirectory=""%~dp0"":Shortcut.Save:close")
  7.         ) ELSE (
  8.                 IF EXIST "%SystemRoot%\System32\WindowsPowerShell\v1.0\Powershell.exe" (
  9.                         Powershell.exe -Command "$WshShell = New-Object -ComObject WScript.Shell; $LnkPath = [Environment]::GetFolderPath('Desktop'); $Shortcut = $WshShell.CreateShortcut($LnkPath + '\Notepad++.lnk'); $Shortcut.TargetPath = \"%~dp0Notepad++.exe\";$Shortcut.WorkingDirectory = \"%UserProfile%\";$Shortcut.WindowStyle=1;$Shortcut.Save();"
  10.                         Powershell.exe -Command "$WshShell = New-Object -ComObject WScript.Shell; $LnkPath = [Environment]::GetFolderPath('Programs'); $Shortcut = $WshShell.CreateShortcut($LnkPath + '\Notepad++.lnk'); $Shortcut.TargetPath = \"%~dp0Notepad++.exe\";$Shortcut.WorkingDirectory = \"%UserProfile%\";$Shortcut.WindowStyle=1;$Shortcut.Save();"
  11.                 )
  12.         )
  13. )
复制代码


发表于 2026-3-20 06:47:21 | 显示全部楼层
不要用mshta了,因为最新的win11系统已经不支持了。在xb21cn的精简office中已经改成调用一个小工具实现创建快捷方式了。

点评

那个小工具是不是 Shortcut? [attachimg]573444[/attachimg]  详情 回复 发表于 2026-3-20 18:36
研究一下多一条路嘛 而且对于一些小软件,为了创建快捷方式带上第三方工具不太爽。 现在的目的是:有mshta就用mshta,没有就用powershell。 没有直接用powershell,是因为它的运行速度有点慢。  详情 回复 发表于 2026-3-20 18:33
回复

使用道具 举报

发表于 2026-3-20 08:30:10 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 2026-3-20 09:11:45 来自手机 | 显示全部楼层
文本编辑器选择编码格式为bat,就可以对一下括号的关系。

点评

括号肯定是成对出现的,这个检查了没有问题。  详情 回复 发表于 2026-3-20 18:30
回复

使用道具 举报

发表于 2026-3-20 12:39:59 | 显示全部楼层
来学习的
回复

使用道具 举报

 楼主| 发表于 2026-3-20 18:30:42 | 显示全部楼层
窄口牛 发表于 2026-3-20 09:11
文本编辑器选择编码格式为bat,就可以对一下括号的关系。

括号肯定是成对出现的,这个检查了没有问题。
回复

使用道具 举报

 楼主| 发表于 2026-3-20 18:33:03 | 显示全部楼层
bfgxp 发表于 2026-3-20 06:47
不要用mshta了,因为最新的win11系统已经不支持了。在xb21cn的精简office中已经改成调用一个小工具实现创建 ...

研究一下多一条路嘛
而且对于一些小软件,为了创建快捷方式带上第三方工具不太爽。
现在的目的是:有mshta就用mshta,没有就用powershell。
没有直接用powershell,是因为它的运行速度有点慢。
回复

使用道具 举报

 楼主| 发表于 2026-3-20 18:36:32 | 显示全部楼层
bfgxp 发表于 2026-3-20 06:47
不要用mshta了,因为最新的win11系统已经不支持了。在xb21cn的精简office中已经改成调用一个小工具实现创建 ...

那个小工具是不是 Shortcut?
2026-03-20_183523.jpg

点评

scut.exe,一个13kb的小工具  详情 回复 发表于 2026-3-21 07:31
回复

使用道具 举报

发表于 2026-3-20 18:39:40 | 显示全部楼层
虽然不知道LZ在说什么但是感觉很厉害的样子~
回复

使用道具 举报

发表于 2026-3-20 20:41:49 | 显示全部楼层
本帖最后由 redyear2026 于 2026-3-21 18:16 编辑

在批处脚本中,mshta 代码落入圆括号这类复合语块里,据说会有一个 '禁则',即不能出现嵌套双引号或嵌套单引号,一个简单解法是用 call 方法解围,如下示例
  1. @echo off
  2. if exist "%SystemRoot%\System32\mshta.exe" (
  3.    call :toMSHTA
  4. )
  5. exit/b
  6. :toMSHTA
  7.     Start "" /min mshta.exe VBScript:Execute("Set
  8. WshShell=CreateObject(""WScript.Shell""):Set
  9. Shortcut=WshShell.CreateShortcut(WshShell.SpecialFolders(""Desktop"")
  10. &
  11. ""\Notepad++.lnk""):Shortcut.TargetPath=""%~dp0Notepad++.exe"":Shortcut.WorkingDirectory=""%~dp0"":Shortcut.Save:close")
  12.     exit/b
复制代码
三重语境 bat+vbs+mshta  会使 vbs 处理双引号 '雪上加霜',而用 jscript 平替 vbs 会轻松得多,虽然也要对路径分隔符 \ 倍加呵护,但很容易在复合语块中走通,见下例
  1. @echo off & set "tp=%~dp0Notepad++.exe" & set "wd=%~dp0"
  2. if exist "%SystemRoot%\System32\mshta.exe" (
  3.     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()"
  4. )
  5. exit/b
复制代码





点评

方案1之前就曾测试过,可行,但没保持嵌套,所以没有采用。 方案2,测试出错。  详情 回复 发表于 2026-3-21 14:36
回复

使用道具 举报

发表于 2026-3-20 21:57:57 | 显示全部楼层
本帖最后由 redyear2026 于 2026-3-20 22:01 编辑

挖了一番陈年习作,居然发现一道奇技淫巧,可为 vbs+mshta 代码在批处复合语块中解围,见下例(尾部加一个转义符 ^
  1. @echo off
  2. if exist "%SystemRoot%\System32\mshta.exe" (
  3.     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"^)
  4. )
  5. exit/b
复制代码




点评

经测试,这个方法简单有效,感谢回复!  详情 回复 发表于 2026-3-21 14:35
回复

使用道具 举报

发表于 2026-3-21 06:53:16 来自手机 | 显示全部楼层
对ps一点都不懂,所以无法帮你,抱歉。
回复

使用道具 举报

发表于 2026-3-21 07:31:33 | 显示全部楼层
Anson4 发表于 2026-3-20 18:36
那个小工具是不是 Shortcut?

scut.exe,一个13kb的小工具
回复

使用道具 举报

发表于 2026-3-21 08:15:40 | 显示全部楼层
不错不错
回复

使用道具 举报

 楼主| 发表于 2026-3-21 14:35:36 | 显示全部楼层
redyear2026 发表于 2026-3-20 21:57
挖了一番陈年习作,居然发现一道奇技淫巧,可为 vbs+mshta 代码在批处复合语块中解围,见下例(尾部加一个 ...

经测试,这个方法简单有效,感谢回复!
回复

使用道具 举报

 楼主| 发表于 2026-3-21 14:36:44 | 显示全部楼层
redyear2026 发表于 2026-3-20 20:41
在批处脚本中,mshta 代码落入圆括号这类复合语块里,据说会有一个 '禁则',即不能出现嵌套双引号或嵌套单 ...

方案1之前就曾测试过,可行,但没保持嵌套,所以没有采用。
方案2,测试出错。
回复

使用道具 举报

发表于 2026-3-21 18:19:33 | 显示全部楼层
Anson4 发表于 2026-3-21 14:36
方案1之前就曾测试过,可行,但没保持嵌套,所以没有采用。
方案2,测试出错。 ...

10楼方案2代码已经订正,错打了几个字符,应该可以了。

点评

方案2测试成功 另外有个发现,Windows 11 26H1 有自带 mshta,可是不能用。  详情 回复 发表于 2026-3-23 14:57
回复

使用道具 举报

发表于 2026-3-21 23:54:38 | 显示全部楼层
我是改用cmd套powershell这样的了:
  1. powershell -NoProfile -ExecutionPolicy Bypass -Command "$s=(New-Object -ComObject WScript.Shell).CreateShortcut([System.Environment]::GetFolderPath('Desktop') + '\Internet Download Manager.lnk'); $s.TargetPath='%~dp0IDMan.exe'.Replace('\\','\'); $s.WorkingDirectory='%~dp0'.Replace('\\','\'); $s.Save()"
复制代码
效果和原来差不多,SpecialFolder给出的目录也和原来使用mshta差不多

回复

使用道具 举报

发表于 2026-3-22 10:07:41 | 显示全部楼层
鱼总,新系统 mshta 不能用,WScript 和 CScript 也不能用吗,只要这两个能用,可以转成 VBS 文件执行嘛,这也是一个方案,我现在就这么干

点评

听说有些系统VBS用不了了  详情 回复 发表于 2026-3-22 23:00
回复

使用道具 举报

 楼主| 发表于 2026-3-22 23:00:06 | 显示全部楼层
BEIKING 发表于 2026-3-22 10:07
鱼总,新系统 mshta 不能用,WScript 和 CScript 也不能用吗,只要这两个能用,可以转成 VBS 文件执行嘛, ...

听说有些系统VBS用不了了
回复

使用道具 举报

 楼主| 发表于 2026-3-23 14:57:21 | 显示全部楼层
redyear2026 发表于 2026-3-21 18:19
10楼方案2代码已经订正,错打了几个字符,应该可以了。

方案2测试成功
另外有个发现,Windows 11 26H1 有自带 mshta,可是不能用。
回复

使用道具 举报

发表于 2026-3-23 17:50:03 来自手机 | 显示全部楼层
本帖最后由 redyear2026 于 2026-3-23 18:23 编辑
Anson4 发表于 2026-3-23 14:57
方案2测试成功
另外有个发现,Windows 11 26H1 有自带 mshta,可是不能用。

只要在系统目录中有 mshta.exe 独立运行*.hta 脚本文件还是可以的,如在命令行运行 mshta abc.hta 应该没问题。系统只是阻截了所谓的 '内嵌' 式调用 mshta 代码,例如在批处脚本中直接运行 mshta VBScript:...,如此也就阻断了过去常用的在批处脚本中直接运行 vbs/jscript 代码的方法,改走创建临时文件 *.vbs, *.js 或混编 bat+jscript, bat+vbs 之道吧...

点评

混编 bat+jscript 就是10楼的方案2吗?  详情 回复 发表于 2026-3-23 19:42
回复

使用道具 举报

 楼主| 发表于 2026-3-23 19:42:16 | 显示全部楼层
redyear2026 发表于 2026-3-23 17:50
只要在系统目录中有 mshta.exe 独立运行*.hta 脚本文件还是可以的,如在命令行运行 mshta abc.hta 应该没 ...

混编 bat+jscript 就是10楼的方案2吗?
回复

使用道具 举报

发表于 2026-3-24 12:38:07 | 显示全部楼层
Anson4 发表于 2026-3-23 19:42
混编 bat+jscript 就是10楼的方案2吗?

混编 bat+jscript 版式示例如下,代码存为 *.bat 运行(如 test.bat ),其中第二至第七行是批处代码,第九行开始皆为 jscript 代码,第一和第八行是两种代码的混编分界标识,虽不止一种格式,但本人常用此法。

  1. 2>1/* ::
  2. @echo off &setlocal
  3. set "cs=\Notepad++.lnk"
  4. set "tp=%~dp0Notepad++.exe"
  5. set "wd=%~dp0"
  6. cscript /nologo /e:jscript "%~f0" "%cs%" "%tp%" "%wd%"
  7. exit/b
  8. */
  9. v=WSH.arguments, ws=WSH.createObject('wscript.shell');
  10. lnk=ws.CreateShortcut(ws.SpecialFolders('Desktop')+v(0));
  11. lnk.TargetPath=v(1);
  12. lnk.workingDirectory=v(2);
  13. lnk.Save(), WSH.quit();
复制代码




回复

使用道具 举报

发表于 2026-3-24 15:06:26 | 显示全部楼层
我也在等楼下回帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-17 12:00

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表