尧图精选

用BAT批处理一键批量创建Windows桌面快捷方式的实战指南

🕒 发布时间:2026/9/18 0:50:22 📁 来源:尧图网络
说实话快捷方式这东西大家天天都在点但有没有想过一个问题桌面上那几十个图标如果换了一台新电脑或者重装完系统你要花多长时间一个一个右键、发送到、桌面快捷方式我大概数过装完一轮常用软件光建快捷方式就得浪费十几分钟。后来我用BAT批处理脚本把这事儿变成了一条命令的事。这篇就把我常用的创建快捷方式脚本和相关坑点一次讲清楚给需要批量部署或者不爱做重复劳动的朋友做个参考。如果你不是运维可能对BAT批处理脚本有点陌生。它其实就是一个纯文本文件把Windows本来要在命令行里敲的命令按顺序写进去保存成.bat后缀双击就能自动执行。创建快捷方式这件事听起来简单但Windows的命令行里没有一个原生的“新建快捷方式”命令所以必须借助系统自带的COM对象来实现。这里面有几个小门道往下看。1. 用批处理创建快捷方式的底层思路1.1 为什么选BAT而不是手动创建先别急着写代码想明白为什么用批处理来做这件事你才知道自己省下了什么。新装一台电脑或者给公司批量配机器的时候软件装完了还不算完关键是要把入口摆到用户眼皮底下。手动创建快捷方式的成本远比大家想象得高一个软件要右键、找“发送到”、点“桌面快捷方式”有些软件安装包不给建快捷方式你还要手动去安装目录里翻exe文件如果需要指定图标、参数、起始位置还要右键进属性里一项项改。尤其是“带参数启动”这个需求手动操作特别容易错。拿Chrome多开举例你手动创建快捷方式后改“目标”字段稍不留神就把引号写错整个快捷方式直接打不开。但用BAT脚本把参数固化在脚本里每次执行结果都一样不存在手抖问题。团队协作或者装完系统让同事自行跑一次脚本也比远程教他一步一步右键操作高效得多。除了省时间BAT脚本还有一个隐性好处可迁移。同一个脚本文件复制到任何一台Windows电脑上都能跑不需要装额外的运行时。对于装机量大的企业来说把创建快捷方式的脚本和软件部署脚本拼在一起就能做到从安装到桌面入口一条龙自动化这比任何商业工具都简单直接。1.2 快捷方式背后的机制LNK和COM对象要理解批处理怎么创建快捷方式得先知道Windows里的快捷方式到底是个什么东西。大家看到的.lnk文件本质上是一个二进制文件里面存的不是软件本体而是“目标程序路径”“启动参数”“图标位置”“快捷键”“窗口显示方式”这些元数据。Windows桌面上的图标、开始菜单入口、任务栏固定项统统都是这种指针文件。那为什么cmd里不能直接写一个create shortcut命令因为微软在设计命令行工具时主打的是文件操作和进程管理快捷方式偏向Shell交互层所以没有提供内置指令。这不是做不到而是需要绕到Shell的接口去调用。BAT脚本创建快捷方式核心套路是借用Windows自带的WSHWindows Script Host引擎让VBScript代码去调用WScript.Shell对象的CreateShortcut方法。你可以把这一步理解为批处理本身没有建快捷方式的手但它能临时生成一个VBS脚本让VBS用它的手去办这件事。VBS执行完使命就结束批处理再把临时文件删掉整个过程对用户来说就是双击了一下bat。echo off set targetC:\Windows\System32\notepad.exe set lnk%USERPROFILE%\Desktop\记事本.lnk ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target% echo oLink.Save ) %temp%\make_shortcut.vbs cscript //nologo %temp%\make_shortcut.vbs del %temp%\make_shortcut.vbs上面这段就是最核心的骨架。我建议你先跑通这个再往下面看因为后面所有进阶玩法都是在这个基础上加属性。2. 核心脚本写法与参数详解2.1 理解CreateShortcut的7个常用属性CreateShortcut方法返回一个快捷方式对象你可以给这个对象设置属性设置完调用Save才会真正生成.lnk文件。我把自己常用的属性整理成了一张表属性作用示例值说明TargetPath目标程序或文件路径C:\Program Files\App\app.exe必填指向实际要运行的程序Arguments启动参数--user-data-dirD:\ChromeData多个参数用空格分隔WorkingDirectory起始目录D:\App\bin程序运行时的工作目录IconLocation图标来源C:\icon.ico,0可以指定exe或ico文件WindowStyle窗口启动方式1正常3最大化7最小化数字表示Hotkey快捷键CtrlAltN可选Description备注说明内部工具鼠标悬停提示字段并不算多但实际项目中容易出问题的是WorkingDirectory。如果不设置它有些程序启动后会找不到同目录下的配置文件。比如你要给一个绿色版软件建快捷方式必须把起始目录指向程序所在的文件夹否则程序会去读当前目录下不存在的配置报各种奇怪的错。这一点很多教程没讲但实际踩坑概率很高。2.2 参数拼接与引号陷阱设置Arguments参数时最典型的问题是路径和参数中同时包含引号。假设要给某个程序传一个带空格路径的文件作为参数在VBS里应该写成set paramsD:\Program Files\data\file 01.txt ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target% echo oLink.Arguments %params% echo oLink.Save ) %temp%\make_shortcut.vbs这里用包裹路径是因为VBS把这段内容当做文本写进脚本而Arguments的值本身需要引号所以在批处理里用两个连续的双引号表示一个真实的双引号。这个嵌套关系很容易让人绕晕我的经验是先在记事本里把最终VBS内容拼出来再反推出批处理里该写多少个引号。说白了就是批处理中的转义成VBS文本中的一个VBS解释器再把这个当做字符串的一部分传给COM对象。两层语义一层层剥开看就不乱了。2.3 三种执行方式临时VBS、mshta、PowerShell创建一个快捷方式除了我刚才说的写VBS临时文件再执行还有几条路可走。第一条是mshta方式可以在命令里直接执行JavaScript不用生成临时文件mshta javascript:var shnew ActiveXObject(WScript.Shell);var scsh.CreateShortcut(%USERPROFILE%\\Desktop\\test.lnk);sc.TargetPathC:\\Windows\\System32\\notepad.exe;sc.Save();close();这种写法的优点是不产生临时文件缺点是转义极其痛苦路径里的反斜杠要写成双反斜杠引号层级非常容易错。我建议除非你特别追求“单文件不留痕迹”否则别首选这个方案。第二条是用PowerShell这是新一代推荐做法$ws New-Object -ComObject WScript.Shell $sc $ws.CreateShortcut($env:USERPROFILE\Desktop\记事本.lnk) $sc.TargetPath C:\Windows\System32\notepad.exe $sc.Save()PowerShell对COM对象的调用比VBS更直观而且不用处理临时文件。但缺点是命令相比BAT更长如果在旧版Windows上还得先确认环境。我的习惯是如果用户在Win10及以上且能接受稍慢的启动速度PowerShell方案更清爽如果追求极致的启动速度和系统兼容性还是回退到BAT加VBS的老方案。3. 实战案例从单条到批量自动创建3.1 案例一一键创建常用开发工具桌面快捷方式先看一个稍微完整的例子。假设新到一台电脑我需要把IDEA、Navicat、Chrome、Sublime Text这四个软件的快捷方式都放到桌面直接双击一次脚本全部搞定。echo off setlocal enabledelayedexpansion set TOOL_DIRD:\DevTools set DESKTOP%USERPROFILE%\Desktop call :create_shortcut %TOOL_DIR%\JetBrains\IntelliJ IDEA\bin\idea64.exe IDEA call :create_shortcut %TOOL_DIR%\Navicat\navicat.exe Navicat call :create_shortcut C:\Program Files\Google\Chrome\Application\chrome.exe Chrome call :create_shortcut %TOOL_DIR%\SublimeText\sublime_text.exe Sublime Text exit /b :create_shortcut set target%~1 set name%~2 set lnk%DESKTOP%\%name%.lnk ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target% echo oLink.Save ) %temp%\make_shortcut_%RANDOM%.vbs cscript //nologo %temp%\make_shortcut_%RANDOM%.vbs del %temp%\make_shortcut_%RANDOM%.vbs nul 21 exit /b这个脚本的好处是create_shortcut子过程可以被反复调用每次传入一个路径和一个名字它自动生成并清理临时VBS文件。%~1用来去除参数自带的双引号%RANDOM%用随机数给临时文件命名避免多个脚本实例同时运行的时候互相覆盖临时文件。这个命名细节非常重要我最早没加随机数两次执行间隔太短时就经常出现“另一个程序正在使用此文件”的报错。3.2 案例二修改快捷方式的Windows终端启动属性你可能会问创建快捷方式还要给运行窗口设置成最小化、指定一个专属图标这种情况怎么处理其实就是在VBS里多写两个属性。echo off set targetC:\Tools\MyScripts\run_server.bat set lnk%USERPROFILE%\Desktop\启动服务器.lnk ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target% echo oLink.WorkingDirectory C:\Tools\MyScripts echo oLink.WindowStyle 7 echo oLink.IconLocation C:\Windows\System32\shell32.dll,13 echo oLink.Save ) %temp%\make_shortcut.vbs cscript //nologo %temp%\make_shortcut.vbs if exist %temp%\make_shortcut.vbs del %temp%\make_shortcut.vbsWindowStyle 7的意思是窗口最小化。对于那种启动后台服务或者执行批处理任务的脚本双击后不弹黑色命令窗口体验会好很多。IconLocation的13是shell32.dll里那个齿轮图标的索引具体数字代表哪个图标可以自己用“更换图标”对话框预览后数出来也可以查网上的索引表。很多人不知道的是如果一个批处理脚本快捷方式设置了“最小化”那么被启动的脚本内部最好用start命令去跑真正的程序否则脚本自身的窗口会一直霸占任务栏。比如start D:\server\app.exe这种写法能让新进程独立出来父进程窗口最小化后不干扰用户做其他事。3.3 案例三给批量办公电脑推送标准快捷方式在公司网络环境里往往有多台电脑要统一桌面入口。这时候把BAT和共享路径结合效果非常好。echo off net use Z: \\fileserver\software 2nul set DESKTOP%USERPROFILE%\Desktop set TARGET_PATHZ:\OA系统\client.exe set LNK_NAMEOA办公系统 ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%DESKTOP%\%LNK_NAME%.lnk^) echo oLink.TargetPath %TARGET_PATH% echo oLink.WorkingDirectory Z:\OA系统 echo oLink.Save ) %temp%\create_oa.vbs cscript //nologo %temp%\create_oa.vbs这里用net use映射一个网络驱动器然后直接给网络路径创建快捷方式。这么做有什么好处如果OA客户端升级了运维只需要在服务器上替换程序文件所有员工桌面快捷方式的目标路径不用变指向同一个网络位置即可。如果哪天需要切换服务器改掉映射来源所有客户端跟着变不需要一台台电脑去重做快捷方式。不过有一点必须提醒给网络路径创建快捷方式时WorkingDirectory一定要设置成网络目录否则客户端程序启动后可能找不到网络盘上的配置文件。而且net use指令最好先执行一次确保网络通否则后面创建快捷方式时路径还是断开的。4. 常见坑点与排查技巧实录4.1 路径带空格导致的目标路径被截断这应该是创建快捷方式时发生率最高的问题。假设你的程序路径是C:\Program Files\Common Files\某软件\app.exe如果你在VBS里写TargetPath C:\Program Files\...而不是TargetPath C:\Program Files\...那快捷方式实际保存的路径会停在第一个空格处指向C:\Program双击后系统找不到文件。更隐蔽的是批处理命令行里如果空格两边不加引号整个目标会被拆成多个参数。解决办法就是在BAT里拼VBS文本时所有路径都必须带引号set targetC:\Program Files\Common Files\某软件\app.exe echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target%注意set target...这里的引号和echo oLink.TargetPath %target%这里的引号不是一回事。前者是批处理变量赋值中为了防止尾部空格混入用的后者是写入VBS时用于包裹字符串值的。两处都不能漏。如果你打算用PowerShell方案也有类似问题$sc.TargetPath C:\Program Files\...必须加双引号不然PowerShell会报“表达式或语句中包含意外的标记”。4.2 中文名称乱码与编码选择Windows的批处理文件有个著名的大坑如果脚本里包含中文文件编码选错了执行时中文就会变成乱码快捷方式名字也成了“锟斤拷”。原因很简单cmd默认代码页是GBKCP936如果你的.bat文件用UTF-8编码保存中文汉字就会按GBK解码结果就是一团乱码。反过来如果你把文件保存成了UTF-8带BOM有时代码页切换不对也会出问题。我的经验是只要脚本里包含中文路径、中文显示名、中文字符串就把.bat文件用“ANSI”编码保存。记事本保存时选择“ANSI”即可。如果是VS Code等工具手动切换一下编码再保存别图省事用默认UTF-8。如果你必须用UTF-8那要在脚本开头加一句chcp 65001 nul但这会带来另一个问题某些老程序在UTF-8代码页下显示中文反而异常所以除非必要我一般不推荐在纯BAT脚本里开65001。毕竟我们的目标是创建快捷方式不是处理复杂的多语言输出ANSI编码最稳。还有一个隐藏坑VBS临时文件本身是UTF-8还是ANSI也会影响中文字符。因为临时VBS内容是从BAT里输出来的BAT用什么编码VBS就是什么编码。所以VBS里包含中文路径时编码问题同样要留意用ANSI保存.bat等于一并解决了VBS的编码。4.3 权限不足导致保存失败在给系统盘或者某些受保护目录创建快捷方式时会弹出“拒绝访问”的提示或者在cscript执行时直接报错。最典型的是在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp开机自启目录下创建快捷方式。普通用户权限对这个目录没有写权限尤其Windows 10/11的UAC控制更严格。如果你想做一个“开机自动启动某软件”的快捷方式就要注意权限问题。解决方案分两种给bat文件创建快捷方式然后设置该快捷方式的“高级”属性勾选“用管理员身份运行”再放到启动文件夹。在BAT脚本开头加提权代码自动请求管理员权限然后继续执行。提权代码网上版本很多我贴一个自己常用且验证过的echo off nul 21 reg query HKU\S-1-5-19 || ( powershell -Command Start-Process -FilePath %~f0 -Verb RunAs exit /b )这一小段的作用是检测当前是否已有管理员权限如果没有就通过PowerShell再次启动自身并请求管理员权限。加了这段之后其他逻辑代码放在它后面即可。注意提权后当前工作目录可能会变如果你的脚本依赖相对路径最好先把路径固定下来。4.4 杀毒软件拦截临时VBS还有一类问题跟安全软件有关。某些杀毒软件会把“批处理生成VBS并执行”这个行为判定为可疑操作因为很多恶意脚本也是这么干的。于是你的脚本刚运行杀毒软件就弹窗警告有的甚至直接把临时VBS删了导致快捷方式创建失败。解决思路有三个第一种临时文件命名尽量不要用temp.vbs这种太常见的名字用%RANDOM%随机名能降低误报概率。第二种尽量少在VBS里做文件操作以外的复杂动作。如果你的VBS只是调用了CreateShortcut行为相对正常很多杀毒软件不会拦截。第三种如果公司有内网环境可以把bat脚本和生成的文件统一加入杀白名单这需要管理员配合。个人使用的话建议把脚本内容公开、签名或者至少放在自己明令信任的文件夹里安全软件一般支持“添加信任目录”。我自己的经验是临时VBS执行完要立刻删除不留下可疑文件。如果因为被杀毒软件删除而报错del命令那边记得加nul 21不要因为文件不存在让批处理窗口报红色错误。4.5 快捷方式创建成功但双击打不开最后排查一个看似荒谬但频率很高的问题快捷方式明明创建成功图标也能显示但双击之后提示“目标不存在”或者一闪而过。先检查TargetPath是不是指向了完整有效路径特别是环境变量是否展开成功。比如%USERPROFILE%如果没展开快捷方式里存的字面量就是“%USERPROFILE%\Desktop\a.exe”系统不会自动解析环境变量自然找不到。其次检查Arguments里的参数有没有被错误转义。如果参数里包含文件路径路径本身又有空格需要多层引号嵌套。我的经验是先在cmd里手动试一遍完整命令确认能运行之后再往BAT里搬。还有一种情况是程序本身依赖相对路径它的主程序必须在固定工作目录下运行。如果只设置了TargetPath不设置WorkingDirectory程序启动后会把当前目录当成它的起始目录找不到相对路径下的DLL或配置表现就是闪退或者报“缺少xxx.dll”。这时给快捷方式对象加上WorkingDirectory属性指向程序所在目录即可。5. 进阶玩法把创建快捷方式组合到更多自动化流程里5.1 与系统清理脚本组合热词里我看到很多人搜“清理C盘垃圾文件bat”这种脚本往往会配合创建快捷方式一起用。比如说写一个综合工具箱bat菜单里有“清理垃圾”“创建桌面快捷方式”“修复网络”等选项选择对应的数字就跳转到对应的功能模块。我自己做过一个版本菜单逻辑用choice命令实现echo off :menu cls echo echo 常用工具批处理菜单 echo echo 1. 清理系统临时文件 echo 2. 创建桌面常用快捷方式 echo 3. 关闭不必要的后台服务 echo 4. 退出 echo choice /c 1234 /n /m 请选择操作: if errorlevel 4 exit /b if errorlevel 3 call :optimize_services if errorlevel 2 call :create_shortcuts if errorlevel 1 call :clean_temp goto menu创建快捷方式的作用有时候不是替代手动操作而是作为一个入口聚合器把清理、优化等操作打包成普通用户看得懂的图标。这个思路对于给长辈、给非技术同事做工具包特别实用。5.2 从BAT转EXE的发布方案如果你做好的bat是给别人用的可以直接发.bat文件但普通用户经常被杀毒软件误报吓到或者不小心用记事本打开改乱代码。这时候可以考虑把bat转换成exe。相关热词里的“bat to exe converter”指的就是这类工具常见的有Bat To Exe Converter、Quick Batch File Compiler等。它们本质是把bat脚本和解释器打包成一个exe运行后释放到临时目录再执行所以脚本里的功能不变。转exe有一个额外的好处可以设置图标和版本信息看起来更像正式软件。坏处是某些杀毒软件对自解压型的exe同样敏感而且脚本一旦编译别人看不到源码反而会不信任。所以我的建议是内部工具用bat直接发对外发布再考虑转exe。5.3 兼容性说明.bat和.cmd的区别很多人会问为什么有的脚本后缀是.bat有的是.cmd到底有什么区别从创建快捷方式这个场景来看两者都能用。但你要知道几个细节.cmd是在Windows NT 4.0之后引入的而.bat为了兼容老系统在命令处理上有一些细微差异比如错误处理方式和变量延迟扩展的行为略有不同。执行外部命令时.bat和.cmd在errorlevel的处理上有区别但写快捷方式脚本一般不涉及那么细。系统默认双击都是调用cmd.exe来运行所以对最终用户没有感知差异。如果让我推荐新建的批处理脚本统一用.bat因为它兼容性最好而且绝大多数教程和示例都以.bat为例。但如果你的脚本要配合比较新式的逻辑判断、字符串处理.cmd在某些场景下的行为更符合预期。6. 完整示例一个直接可以抄的“桌面快捷方式生成器”既然要做成案例我把最常用的版本整理成一个完整脚本。这段代码融合了前面讲的几个要点支持多个软件、支持设置参数、支持自定义图标、样式设置并且按ANSI编码保存后可以直接使用。echo off rem rem 桌面快捷方式批量生成器 rem 适用Windows 7 / 10 / 11 rem 保存编码ANSI rem set DESKTOP%USERPROFILE%\Desktop call :add_shortcut C:\Program Files\Notepad\notepad.exe Notepad call :add_shortcut C:\Windows\System32\mspaint.exe 画图 call :add_shortcut C:\Program Files\Google\Chrome\Application\chrome.exe Chrome --user-data-dirD:\UserData\Chrome echo 快捷方式创建完成。 pause exit /b :add_shortcut rem %~1 - 目标程序路径 rem %~2 - 快捷方式名称 rem %~3 - 启动参数可选 set target%~1 set name%~2 set args%~3 set lnk%DESKTOP%\%name%.lnk if %args% ( ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target% echo oLink.WorkingDirectory %~dp1 echo oLink.Save ) %temp%\mk_lnk_%RANDOM%.vbs ) else ( ( echo Set oWS WScript.CreateObject^(WScript.Shell^) echo Set oLink oWS.CreateShortcut^(%lnk%^) echo oLink.TargetPath %target% echo oLink.Arguments %args% echo oLink.WorkingDirectory %~dp1 echo oLink.Save ) %temp%\mk_lnk_%RANDOM%.vbs ) cscript //nologo %temp%\mk_lnk_%RANDOM%.vbs del %temp%\mk_lnk_%RANDOM%.vbs nul 21 exit /b这段代码里有个细节要注意WorkingDirectory %~dp1表示目标程序所在的磁盘和路径这是从%1中自动提取的不用手动写每个程序的目录省了很多事。用的时候只需要在call :add_shortcut那一行改路径和名称不需要懂原理也能照着用。想加更多软件就在后面继续加行一行一个。7. 最后再分享两个实用技巧创建快捷方式这件事操作是固定的但使用场景千变万化。我个人在实战中收获最大的两个经验第一个经验是“快捷方式也可以用批处理批量修改”。你不需要删掉旧的重新建只要把CreateShortcut指向同一个lnk路径重新设置属性后调用Save原有的快捷方式就会被覆盖更新。这个技巧在处理“软件从D盘迁移到E盘”或者“修改启动参数”时尤其好用不用去每台机器上挨个改属性。第二个经验是“快捷键一次设好后面天天受益”。用Hotkey属性给快捷方式绑定一个全局快捷键比如CtrlAltO打开OA系统CtrlAltS打开截图工具这在办公场景下效率提升非常明显。绑定过之后不需要额外运行常驻程序Windows会自动响应比第三方快捷启动工具更轻量。动手试试吧把电脑里最常用的几个软件用批处理生成一遍快捷方式跑通了以后你会回来感谢这条命令的。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →