BAT批处理创建快捷方式:从COM原理到批量部署实战
2026/9/17 13:44:20 网站建设 项目流程

先问一个扎心的问题:你上一次手动右键“发送到桌面快捷方式”是什么时候?如果只是建一两个,其实无所谓;但你要是刚重装完系统、或者要给公司十几台电脑统一部署桌面环境,一个个右键创建,再一个个改“目标”和“起始位置”,那真的是纯纯的体力活。网上随便一搜,热门需求全是这类:共享盘怎么创建桌面快捷方式、谷歌浏览器多开怎么用txt转bat、网页快捷方式怎么指定浏览器、c盘清理bat和防锁屏bat脚本……你会发现大家的共同诉求其实是同一个:怎么用BAT批处理脚本,把快捷方式这件事批量、自动、可重复地做掉。

这篇文章就围绕“BAT创建快捷方式”这个主题,把底层原理、三条可行的技术路线、高频实战案例、以及我踩过的各种坑一次讲透。每个案例都给可直接复制的脚本,标明了适用场景和注意事项。不管你是刚接触批处理的新手,还是想往自己的bat工具箱里加料的老手,应该都能从中找到能直接“抄作业”的东西。

1. 快捷方式的本质:为什么BAT必须“借道”COM组件

很多新手上来就想当然:快捷方式不就是个文件吗?我用echo写几行文本不行吗?不行。.lnk快捷方式本质上是 Windows 的IShellLink COM 接口序列化后生成的二进制文件,不是纯文本,你没法用记事本和echo拼出来。它内部存的不是简单一个路径,而是一套结构化数据:目标程序路径、启动参数、工作目录、图标位置、快捷键、窗口启动方式、备注信息等。

BAT本身没有直接操作这种二进制结构的能力,所以必须“借道”。最经典、最正统的借道方式就是WScript.Shell 这个COM对象。Windows 自带的脚本宿主(WSH,也就是 wscript.exe / cscript.exe)暴露了一个WScript.Shell对象,它有一个CreateShortcut方法,专门用来创建和读取.lnk快捷方式。拿到快捷方式对象后,你可以设置它的各种属性,最后调用Save方法真正写盘。

这部分如果不理解透,后面写脚本就会一直有一种“为什么代码这么绕”的别扭感。用一句话概括:BAT负责控制流程,真正干活的是VBScript或PowerShell里的COM对象。

下面是WshShortcut对象最常用的几个属性,照着填就行:

属性作用示例值
TargetPath目标程序、文件夹或路径C:\Windows\System32\notepad.exe
Arguments启动参数--user-data-dir=D:\ChromeData\work
WorkingDirectory工作目录,也就是“起始位置”D:\Tools\PortableApp
IconLocation图标位置,格式是“路径,索引”C:\Windows\System32\SHELL32.dll,13
Hotkey快捷键组合CTRL+ALT+N
WindowStyle启动窗口状态,1正常/3最大化/7最小化7
Description备注说明网管批量部署
Save保存写入磁盘,不调用等于白改必须调用

注意最后一条:Save不调用,前面所有属性设置都是“只改内存、不落盘”。这是新手最常见的翻车原因之一,网上很多从论坛抄来的半截代码就是漏了这一句。

另外提一个面试相关的点:很多公司面试考bat的时候,特别喜欢问“怎么用脚本创建快捷方式”。标准答案就是刚才这句话——通过WScript.ShellCreateShortcut方法。你要是能再补一句“快捷方式本质上是IShellLink接口序列化出来的二进制文件”,面试官基本就会觉得你是真干过活的。

2. 三条技术路线对比:临时VBS、mshta一行流、PowerShell

既然要借道,怎么借就有讲究。我自己常用三种方式,各有各的适用场景。先给结论,再逐个拆解。

方法代码量中文/空格路径支持启动速度适用场景
生成临时VBS再执行10行左右很好正式脚本、批量部署、路径复杂
mshta一行流1行需要额外转义最快临时手敲、纯英文简单路径
PowerShell命令1到2行很好慢(约0.5到1秒)需要动态获取桌面路径、与PS混用

2.1 方法一:生成临时VBS再执行(最稳,推荐)

原理很简单:BAT在运行时把VBScript代码逐行echo到一个临时.vbs文件,然后调用cscript执行这个文件,执行完顺手删掉。这样做的最大好处是,VBS里可以使用完整的多行代码,字符串里的引号、中文字符、带空格的路径都能正确处理。

@echo off setlocal set "TARGET=C:\Windows\System32\notepad.exe" set "LINK=%USERPROFILE%\Desktop\记事本.lnk" ( echo Set WshShell = WScript.CreateObject("WScript.Shell"^) echo Set oLink = WshShell.CreateShortcut("%LINK%"^) echo oLink.TargetPath = "%TARGET%" echo oLink.Save )>"%TEMP%\mklnk.vbs" cscript //nologo //B "%TEMP%\mklnk.vbs" del "%TEMP%\mklnk.vbs" >nul 2>&1 endlocal

这段脚本里有一个关键细节:echo Set WshShell = WScript.CreateObject("WScript.Shell"^)这一行末尾的^是转义符,因为整段echo处在一个(...)括号块里,如果不对CreateObject("WScript.Shell")结尾的右括号做转义,cmd会把那个)当成块的结束符,脚本直接报语法错误。这个坑我在早期写批量脚本时踩过不止一次。

执行过程是cscript //nologo //B//nologo不显示版本Logo,//B是批处理模式,不弹交互框,适合在bat里静默跑。如果你希望创建快捷方式时能看到详细的VBS报错信息,可以把//B去掉。

2.2 方法二:mshta一行流(适合临时快速建)

mshta是系统自带的HTML应用程序宿主,可以执行VBScript或JavaScript。利用它,可以把创建快捷方式压缩成一整行代码,非常适合在命令行里临时敲一下。

mshta "javascript:var o=new ActiveXObject('WScript.Shell');var s=o.CreateShortcut('%USERPROFILE%\\Desktop\\test.lnk');s.TargetPath='%WINDIR%\\notepad.exe';s.Save();close();"

这里我特意用JavaScript而不是VBScript,原因是JS字符串可以用单引号,和cmd外层的双引号不冲突,嵌套引号问题少一大半。另一个容易踩的细节是路径里的反斜杠:%USERPROFILE%展开后是C:\Users\你的名字,直接放进JS字符串里,\U会被当成转义字符吞掉反斜杠,所以必须先把环境变量里的反斜杠翻倍,变成C:\\Users\\你的名字,JS执行时才会还原成单个反斜杠。如果快捷方式路径本身还有空格,比如用户名带空格,这条路会非常麻烦,建议直接换方法一。

这个方法适合什么场景呢?就是你在CMD窗口临时试一下、或者手头没有现成脚本、一分钟内想验证某个思路的时候。正式项目、要交付给同事用的脚本,我强烈不建议用这种一行流,可读性和稳定性都不行。

2.3 方法三:PowerShell命令(适合与PS混合的脚本环境)

Windows 10/11上PowerShell已经是标配了,直接借它的COM调用能力也行:

powershell -NoProfile -ExecutionPolicy Bypass -Command "$s=(New-Object -ComObject WScript.Shell).CreateShortcut([Environment]::GetFolderPath('Desktop')+'\Test.lnk');$s.TargetPath='C:\Windows\System32\notepad.exe';$s.Save()"

这段代码最强的地方在[Environment]::GetFolderPath('Desktop')——它能返回当前用户真正的桌面路径,即使桌面被OneDrive重定向过也能拿到正确位置。这一点BAT里的%USERPROFILE%\Desktop做不到。

代价是PowerShell冷启动速度比较慢,每次调用大概要多等0.5到1秒。单独建一两个快捷方式无所谓,但如果你在for循环里批量建几十个,这个时间就会累加成体感很明显的问题。所以我的习惯是:批量场景用临时VBS,单独敏捷操作用mshta,只有需要动态探测系统路径时才用PowerShell。

3. 高频实战案例:把BAT做成通用快捷方式生成器

接下来进入实战。我从热搜词里挑了四个最典型的场景,全部用方法一的临时VBS写法,因为这才是真正能放进工具箱、反复使用的形态。

3.1 桌面快捷方式 + 自动识别OneDrive桌面重定向

现在很多电脑开了OneDrive的文件夹备份,桌面实际路径是C:\Users\你的名字\OneDrive\Desktop,而不是C:\Users\你的名字\Desktop。如果你把快捷方式固定写到后者,会出现“脚本运行成功但桌面啥也没有”的诡异现象。

先做一个兼容判断:

@echo off setlocal set "TARGET=D:\Software\Notepad3\Notepad3.exe" if exist "%USERPROFILE%\OneDrive\Desktop" ( set "LINK=%USERPROFILE%\OneDrive\Desktop\记事本3.lnk" ) else ( set "LINK=%USERPROFILE%\Desktop\记事本3.lnk" ) ( echo Set WshShell = WScript.CreateObject("WScript.Shell"^) echo Set oLink = WshShell.CreateShortcut("%LINK%"^) echo oLink.TargetPath = "%TARGET%" echo oLink.IconLocation = "%TARGET%,0" echo oLink.Save )>"%TEMP%\mklnk.vbs" cscript //nologo //B "%TEMP%\mklnk.vbs" del "%TEMP%\mklnk.vbs" >nul 2>&1 endlocal

IconLocation = "%TARGET%,0"表示使用目标exe自己的第一个图标。很多绿色软件的图标不止一个,索引从0开始数,你可以改成1、2去试。如果目标程序本身没有内嵌图标,也可以换成系统图标库,比如C:\Windows\System32\SHELL32.dll,13

3.2 谷歌浏览器多开:Arguments和WorkingDirectory怎么配

热搜里“谷歌浏览器多开txt转bat”说明这个需求非常普遍。Chrome多开的原理就是通过--user-data-dir参数指定一个独立的用户数据目录,让每个快捷方式对应一个“独立浏览器”,互不干扰,可以同时登录不同账号。

@echo off setlocal set "CHROME=C:\Program Files\Google\Chrome\Application\chrome.exe" set "LINK=%USERPROFILE%\Desktop\Chrome-工作.lnk" set "ARGS=--user-data-dir=D:\ChromeData\work https://mail.google.com" ( echo Set WshShell = WScript.CreateObject("WScript.Shell"^) echo Set oLink = WshShell.CreateShortcut("%LINK%"^) echo oLink.TargetPath = "%CHROME%" echo oLink.Arguments = "%ARGS%" echo oLink.WorkingDirectory = "C:\Program Files\Google\Chrome\Application" echo oLink.Save )>"%TEMP%\mklnk_chrome.vbs" cscript //nologo //B "%TEMP%\mklnk_chrome.vbs" del "%TEMP%\mklnk_chrome.vbs" >nul 2>&1 endlocal

两个细节值得注意。第一,Chrome的Application目录我特意在脚本里用完整路径,因为Chrome有时候会因为工作目录不对导致设置读取异常。第二,--user-data-dir后面我建议用D:\ChromeData\work这种不带空格的路径。如果必须带空格,Arguments 里就得出现引号,VBS字符串里的引号要写双份,非常容易踩坑。真要带引号参数的话,可以用set "ARGS=--user-data-dir=""D:\My Chrome\work"" https://mail.google.com",echo 进VBS后就会变成合法的"--user-data-dir=""..."""这种VBS转义写法——但我个人的建议是能避免就避免。

类似逻辑可以套用到其他软件:凡是支持命令行参数的,比如 VS Code 的-n开新窗口、网易云音乐的指定歌单链接、钉钉/飞书的指定聊天链接,都可以用同一套脚本生成“带场景的快捷方式”。

3.3 自定义图标、快捷键、最小化运行

有些工具类脚本我们希望双击后不弹黑窗口,或者一启动就最小化,这就要用到WindowStyle。还有些内部工具希望全局快捷键一键呼出,用Hotkey属性。

echo oLink.IconLocation = "C:\Windows\System32\SHELL32.dll,13" echo oLink.Hotkey = "CTRL+ALT+N" echo oLink.WindowStyle = 7 echo oLink.Description = "开机自启防锁屏脚本"

Windows定义的窗口状态码如下:1是正常窗口,3是最大化,7是最小化。如果你创建一个指向bat脚本的快捷方式,并把 WindowStyle 设为7,双击后那个黑色控制台窗口会直接最小化到任务栏,不会遮住屏幕。这个技巧在“开机启动防锁屏脚本”“后台同步脚本”这类场景里非常实用。

Hotkey的格式是"CTRL+ALT+N"这种组合方式,支持CTRLALTSHIFTWIN与字母、数字、F功能键的组合。要注意的是,这个快捷键是全局生效的,设了就不要和常用软件的快捷键冲突。

3.4 开始菜单与启动文件夹:三种特殊位置写法

快捷方式不只在桌面,还经常要放到开始菜单和启动文件夹。路径对应关系如下:

位置路径
当前用户开始菜单%APPDATA%\Microsoft\Windows\Start Menu\Programs
所有用户开始菜单C:\ProgramData\Microsoft\Windows\Start Menu\Programs(需管理员权限)
当前用户启动文件夹%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
公共桌面(所有用户桌面)C:\Users\Public\Desktop(需管理员权限)

启动文件夹是很多人做“开机自启”的惯用位置。比如热搜里那个“windows防锁屏bat脚本”,如果把bat本体放在D盘,再在启动文件夹里创建一个指向它的快捷方式,比直接把bat复制到启动文件夹有个明显好处:更新脚本时只需要改D盘那一份,快捷方式不受影响。配合3.3节的WindowStyle=7,开机自启时控制台窗口会最小化,不打扰工作。

4. 特殊需求实战:网页、共享盘、便携软件、批量部署

普通的exe快捷方式会建了,接下来这几个特殊需求才是真正拉开差距的地方。

4.1 网页快捷方式并指定浏览器

如果你只是想做一个打开网址的快捷方式,其实不用走COM对象——网页快捷方式有专门的.url文本格式,BAT直接用echo就能生成:

( echo [InternetShortcut] echo URL=https://www.baidu.com echo IconIndex=13 echo IconFile=C:\Windows\System32\SHELL32.dll )>"%USERPROFILE%\Desktop\百度一下.url"

.url文件的限制是:它只能调用系统默认浏览器。热搜里“网页快捷方式指定浏览器”,意思可能是“我就想用Chrome打开,不想让系统默认的Edge抢走”。这时候还是得用.lnk,把目标指向浏览器exe,把网址写在 Arguments 里:

set "EDGE=C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" set "LINK=%USERPROFILE%\Desktop\内网系统.lnk" set "ARGS=https://oa.example.com --new-window"

这样既指定了浏览器,又能带启动参数(比如强制新窗口)。对内部系统、报表系统这类“必须用指定浏览器”的场景,这个方案是标准的。

4.2 共享盘/局域网路径快捷方式

公司共享目录创建桌面快捷方式,热搜常年霸榜。做法很简单:把快捷方式的TargetPath直接设为UNC路径即可。

set "SHARE=\\192.168.1.50\share\部门文档" set "LINK=%USERPROFILE%\Desktop\公司共享盘.lnk" ( echo Set WshShell = WScript.CreateObject("WScript.Shell"^) echo Set oLink = WshShell.CreateShortcut("%LINK%"^) echo oLink.TargetPath = "\\192.168.1.50\share\部门文档" echo oLink.Save )>"%TEMP%\mklnk_share.vbs" cscript //nologo //B "%TEMP%\mklnk_share.vbs" del "%TEMP%\mklnk_share.vbs" >nul 2>&1

这里有个实战细节:UNC路径在部分环境里首次双击会断言“没有权限”或者卡好几秒,因为系统要先认证网络共享。如果你希望快捷方式打开后直接定位到共享盘,也可以改成把TargetPath指向C:\Windows\explorer.exe,然后在Arguments里写\\192.168.1.50\share\部门文档。两种做法效果略有差异,前者会直接打开共享目录,后者会先启动资源管理器再去访问,在部分老系统上后者兼容性更好。

4.3 便携版软件的工作目录陷阱

绿色便携软件(portable app)对“工作目录”特别敏感。很多便携软件靠相对路径加载同目录下的配置、插件、DLL,如果快捷方式的“起始位置”不对,软件能启动起来但功能异常,比如找不到皮肤、找不到语言包。

对应到脚本里,就是WorkingDirectory属性。你在生成快捷方式时如果发现目标程序启动后各种文件丢失,八成是这里没设对:

echo oLink.WorkingDirectory = "D:\Tools\PortableApp"

还有一种情况:快捷方式指向的是一个bat脚本,而这个bat脚本里用了> somefile.txt这种输出重定向。重定向的“当前目录”取决于快捷方式的WorkingDirectory。如果这个目录不存在,bat运行时会直接报The system cannot write to the specified device。我在帮别人排查“bat备份MySQL数据库报无法写入设备”这类问题时,查到最后发现好多次都是快捷方式工作目录填了个已经被删掉的路径。这个问题换个方向理解就通透了:快捷方式的“起始位置”直接影响后面一整串依赖相对路径的操作。

4.4 批量部署:一个MakeLink函数一键生成一堆快捷方式

如果要在新电脑上一次性建十几个快捷方式,最优雅的写法是封装一个:MakeLink子函数,然后用几行call调用。

@echo off setlocal call :MakeLink "%USERPROFILE%\Desktop\字体查看器.lnk" "D:\Tools\FontView\FontView.exe" "" "D:\Tools\FontView" call :MakeLink "%USERPROFILE%\Desktop\Chrome-工作.lnk" "C:\Program Files\Google\Chrome\Application\chrome.exe" "--user-data-dir=D:\ChromeData\work https://mail.google.com" "C:\Program Files\Google\Chrome\Application" call :MakeLink "%USERPROFILE%\Desktop\公司共享盘.lnk" "\\192.168.1.50\share\部门文档" "" "" call :MakeLink "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\keepawake.lnk" "D:\Tools\keepawake.bat" "" "D:\Tools" echo 快捷方式创建完成。 pause exit /b :MakeLink if "%~1"=="" goto :eof ( echo Set WshShell = WScript.CreateObject("WScript.Shell"^) echo Set oLink = WshShell.CreateShortcut("%~1"^) echo oLink.TargetPath = "%~2" if not "%~3"=="" echo oLink.Arguments = "%~3" if not "%~4"=="" echo oLink.WorkingDirectory = "%~4" if not "%~5"=="" echo oLink.IconLocation = "%~5" echo oLink.Save )>"%TEMP%\mklnk_%RANDOM%.vbs" cscript //nologo //B "%TEMP%\mklnk_%RANDOM%.vbs" del "%TEMP%\mklnk_%RANDOM%.vbs" >nul 2>&1 goto :eof

这段脚本的核心在于%~1%~2这类参数引用——它们会自动去掉外层引号,即使参数里带空格也能塞进后续的双引号字符串里。if "%~1"=="" goto :eof是对空参数的保护。%RANDOM%用来生成一个随机的临时VBS文件名,避免多个批处理实例同时跑的时候互相覆盖。

实际操作中,我把这个函数文件命名为mklnk.bat,放在D:\Tools目录里,凡是新电脑需要恢复桌面环境,就把call :MakeLink那些行替换成当次需要的清单,运行一次,十秒内全部搞定。

5. 高频翻车现场排查手册

脚本能跑通只是第一步,真正折磨人的是各种环境差异导致的“在我电脑上没问题,到你电脑上就废了”。下面这些坑,基本上都是我逐个趟过的。

5.1 中文乱码:编码问题贯穿BAT和VBS

中文系统下,BAT脚本最常见的翻车点就是编码。如果你用记事本把bat存成UTF-8编码,脚本里的中文路径、中文注释在运行时大概率变成乱码。原因在于:cmd默认使用当前系统的OEM代码页(中文系统通常是GBK/936),而UTF-8是65001,两边对不上。

解决方案有两个方向:

  • 最简单粗暴:记事本另存为时,编码选“ANSI”。中文系统里ANSI就是GBK,cmd读起来一点毛病没有。
  • 如果你必须用UTF-8,就在bat开头加一行chcp 65001 >nul,强制切换代码页。

但这里有个隐藏得更深的坑:当你用方法一生成临时VBS时,VBS文件里继承的是bat的字节。WSH解析.vbs文件时,默认按ANSI读取。也就是说,如果你的bat是GBK编码,echo出去的中文VBS能正常解析;如果bat被chcp 65001切成了UTF-8,VBS文件里的中文就会变成ANSI下的乱码。所以我的建议始终是:整套脚本链路(bat + vbs临时文件)保持ANSI编码一致,不要混用。如果你部署的目标机器有英文版系统,最保险的做法就是脚本里非必要不用中文,快捷方式文件名也用英文。

5.2 .bat 和 .cmd 的真实区别 + 右键“以管理员身份运行”消失

热搜里“bat和cmd文件的区别”也是个反复被问的问题。结论其实很朴素:两者都由同一个cmd.exe引擎执行,.bat是DOS时代就有的扩展名,主要价值是兼容老系统;.cmd是Windows NT时代引入的,微软的官方建议是新写的脚本优先用.cmd,因为错误处理行为更一致。实际体感上,还有一个很多人没提的差异:某些杀毒软件对.bat的误报率明显高于.cmd,因为历史上恶意bat太多。你要是在公司环境做分发,尽量用.cmd能少触发几轮安全告警。

至于“.bat文件右击怎么没有以管理员身份运行了”这个问题,在Windows 11上非常常见——不是你的注册表坏了,而是Win11的新版右键菜单把“以管理员身份运行”收进了二级菜单。解决办法:选中文件后按Shift+F10呼出完整配置菜单,或者点右键菜单底部的“显示更多选项”。如果是Win10或Win7上真的不见了,先检查.bat的文件关联有没有被第三方编辑器接管,在管理员CMD里执行:

assoc .bat=batfile ftype batfile="%1" %*

这会把.bat的文件关联恢复到系统默认,右键菜单里的“以管理员身份运行”通常就回来了。

5.3 管理员权限下写入“公共位置”被重定向

C:\ProgramData\...C:\Users\Public\Desktop写快捷方式时,如果你没有以管理员身份运行脚本,Windows的UAC虚拟化会把写入操作偷偷重定向到当前用户的VirtualStore目录,也就是%LOCALAPPDATA%\VirtualStore\ProgramData\...。表现为:脚本运行成功,你自己看着好像也在,但其他用户登录后桌面/开始菜单里什么都没有。

排查方法其实很简单:创建完后,用资源管理器到真实的C:\ProgramData\...路径下看一眼文件在不在。如果不在,去VirtualStore找一下。从根本上解决:

  • 需要写公共位置的脚本,右键“以管理员身份运行”;
  • 或者把快捷方式统一写进当前用户各自的%APPDATA%\...%USERPROFILE%\Desktop,不需要管理员权限,也不存在虚拟化问题。

对批量部署来说,后一种方式才是主流——每个用户的快捷方式归各自用户管,互不干扰,卸载也干净。

5.4 参数里的空格、引号、特殊符号和常见报错

路径带空格其实是家常便饭,方法一里字符串都被双引号包裹,所以问题不大。真正麻烦的是参数值里需要再嵌套引号的情况,比如Chrome的--user-data-dir路径带空格。VBS字符串里要表示一个引号,就必须写两个引号""。在bat的echo环节,这意味着你要先把参数变量里的引号全部翻倍:

set "ARGS=--user-data-dir="D:\My Chrome\work" https://mail.google.com" set "ARGS=%ARGS:"=""%"

第一行给变量赋了一个含引号的值,第二行把所有"替换成""。这样echo进VBS后,VBS解析出来的字符串就带上了正确的引号。这个方法通用性很强,同样适用于路径里出现&|>这类特殊字符的场景——先把它们变成VBS认识的形式,再由VBS去还原。

如果你遇到系统找不到指定的路径,优先检查三处:TargetPath是不是真的存在、WorkingDirectory是否有效、UNC路径是否需要先建立网络连接。如果遇到cannot write to the specified device,基本可以锁定当前工作目录无效或目标设备不存在,去查快捷方式的“起始位置”。

5.5 “文件变成快捷方式了”:根因和恢复

热搜里“文件变成快捷方式了”这个话题,严格来说和“创建快捷方式”方向相反,但很多人会一起搜到,说明这个坑确实普遍。最常见的原因有三个:

  1. OneDrive“仅联机文件”模式:云端的文件在本地只显示一个占位符/快捷方式形态,实际上没下载到本机。解决办法是右键文件“始终保留在此设备上”,或在同步设置里关闭按需文件。
  2. 原文件被移动或删除:旧的.lnk还在,指向的目标已经没了,看起来就是“一个坏掉的快捷方式”。恢复方法就是用Everything搜原文件的真实名字,找到后重新指向。
  3. U盘/移动硬盘病毒:经典症状是所有文件夹都变成同名快捷方式,真实文件夹被attrib +h +s隐藏了。处理方式是在CMD里进到对应盘符执行:
attrib -h -s -r "X:\*" /s /d del "X:\*.lnk" /f /q

attrib去掉隐藏和系统属性后,真实文件夹会重新显示;删除lnk前务必确认没有你自己的重要快捷方式混在里面,最好先只执行attrib那一行,确认无误再删。

6. 安全提醒:bat工具箱能省事,也能惹事

最后必须说几句安全相关的内容,因为热搜里出现频率不低的“bat无限弹窗关不掉”“综合bat工具箱”“跳一跳辅助下载”这些词,其实已经暴露了风险:bat脚本能被用来创建快捷方式,也能被用来做开机自启和更隐蔽的事情。很多来源不明的“游戏辅助”“激活工具”本质上就是一个bat,双击运行后往启动文件夹里塞快捷方式,再配合PowerShell下载后续载荷。

我自己见过最典型的一种“无限弹窗”恶意脚本,核心就是:loop里面一个start cmd,把系统桌面刷满黑窗口。遇到这种情况,先Ctrl+C不一定能停干净,最直接的办法是打开任务管理器,把cmd.exewscript.exe全部结束,然后去启动文件夹和注册表Run项清理掉对应的快捷方式/键值。这也是为什么我一直强调:从网上下载的bat工具箱,一定要先右键用记事本打开,把每一行都看明白了再运行。如果里面出现往Startup目录写文件的命令,或者调用陌生的PowerShell下载命令,直接删掉不要犹豫。

如果你自己写工具给人用,记住一条原则:尽量不要用快捷方式的方式把别人的脚本塞进启动项——这恰恰是恶意软件最常用的持久化手段。你要是给自己的电脑做开机自启,宁可手动确认一次,也别让脚本替你“顺手”完成。

7. 我的习惯:一个mklnk.bat的长期维护经验

这几点其实算不上什么高深理论,纯粹是几年下来养成的习惯,但确实帮我避掉了大量重复劳动。

第一,我始终把mklnk.bat放在D:\Tools而不是桌面。每次重装系统,桌面会清空,但D盘的工具目录不动。新系统装完第一件事就是跑一遍这个脚本,十五个常用软件和内部系统的快捷方式十秒钟全部归位。

第二,脚本里所有临时VBS都写到%TEMP%目录,文件名带%RANDOM%,执行完立即删除。这样既避免多实例并发冲突,也保证了不会在系统里留下临时垃圾。

第三,我习惯在:MakeLink函数里把参数顺序固定为链接路径 / 目标 / 参数 / 工作目录 / 图标,并且每个调用行都写完整注释。三个月后再看这个脚本,不需要回忆就知道每行干什么。

第四,也是最想说的一点:先在自己电脑的虚拟机里把整套脚本跑一遍,再拿到生产环境去用。编码问题、路径问题、权限问题,在虚拟机里暴露的成本最低。我见过太多同事拿着网上抄来的“一键部署脚本”直接在办公电脑上跑,结果把共享盘路径写错、把快捷方式建到VirtualStore里的情况。那些坑,其实都可以在五分钟的本地验证里提前踩掉。

如果你要往自己的bat工具箱里加“创建快捷方式”这个模块,上面这些案例和坑位应该足够你直接开工了。剩下的就是把你自己的软件路径、图标偏好、启动参数填进去,跑一遍,然后享受“一键恢复桌面”的快乐。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询