如何在Windows中通过命令行创建一个快捷方式?

59

我希望我的 .bat 脚本(test.bat)可以创建一个指向它自己的快捷方式,这样我就可以将它复制到 Windows 8 的启动文件夹中。

我编写了以下代码来复制文件,但我还没有找到创建所需快捷方式的方法,正如你所看到的它只是复制了脚本本身。

xcopy "C:\Users\Gabriel\Desktop\test.bat" "C:\Users\Gabriel\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"

你能帮助我吗?


1
http://superuser.com/a/455398/48092 - Aivar
14
我绝对震惊了,无法想象为什么不能从命令行轻松地创建一个快捷方式。 - gunslingor
11个回答

73

你可以使用PowerShell命令。将以下内容添加到批处理脚本中,它将在%userprofile%\Start Menu\Programs\Startup中创建一个到%~f0的快捷方式:

你可以使用 PowerShell 命令。将以下内容添加到批处理脚本中,它将在 %userprofile%\Start Menu\Programs\Startup 中创建一个指向 %~f0 的快捷方式:

powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%userprofile%\Start Menu\Programs\Startup\%~n0.lnk');$s.TargetPath='%~f0';$s.Save()"
如果您不想使用PowerShell,您可以使用mklink命令来创建一个符号链接。语法:
mklink saveShortcutAs targetOfShortcut

在控制台窗口中键入mklink /?以获取完整语法,并访问此网页了解更多信息。

在您的批处理脚本中执行:

mklink "%userprofile%\Start Menu\Programs\Startup\%~nx0" "%~f0"

创建的快捷方式不是传统的.lnk文件,但它应该能够同样地工作。请注意,只有在从与启动文件夹相同的驱动器运行.bat文件时,此方法才起作用。此外,似乎需要管理员权限来创建符号链接。


1
aah.+1. 忘记了 mklink。虽然它在Vista及以上版本中有支持(反正XP已经走向了墓地),但选项不是很丰富。Powershell解决方案要好得多 :) - npocmaka
2
是的,但如果PowerShell尚未为当前Windows会话做好准备,它将导致一秒钟的暂停。您的shortcutJS.bat解决方案应该更快。 - rojo
1
我认为mklink解决方案已经足够应对我当前的项目,我不认为需要更好但更复杂的命令。但是有一些东西我需要绕过:管理员权限。在mklink中是否有配置用户权限的选项? - Maslor
2
дҪҝз”Ёз»„зӯ–з•Ҙзј–иҫ‘еҷЁпјҢжӮЁеҸҜд»Ҙж №жҚ®жӯӨйЎөйқўдҝ®ж”№Configuration\Windows Settings\Security Settings\Local Policies\User Rights AssignmentгҖӮжӮЁиҝҳеҸҜд»ҘдҪҝз”ЁVBи„ҡжң¬еқ—и®©жӮЁзҡ„и„ҡжң¬жҸҗзӨәUACгҖӮиҖҒе®һиҜҙпјҢжҲ‘и®ӨдёәPowerShellе‘Ҫд»ӨжҲ–npocmakaзҡ„shortcutJS.batи§ЈеҶіж–№жЎҲе°ҶеёҰжқҘжңҖдҪіз”ЁжҲ·дҪ“йӘҢгҖӮ - rojo
2
一个文件系统符号链接对于将通过ShellExecuteEx或者CreateProcess硬编码运行%ComSpec%命令解释器的.bat/.cmd脚本打开/运行的文件来说是可以的。但是对于寻找与应用程序目录相关资源的.exe(特别是PE可执行文件,不考虑扩展名)则无法工作。因此,除非该链接在相同的目录中创建(例如prog.2.0.exe => prog.exe),否则.lnk快捷方式通常是更好的解决方案。 - Eryk Sun
显示剩余4条评论

21

无法使用纯批处理完成。请查看shortcutJS.bat - 它是一个jscript / bat混合文件,应该使用.bat扩展名:

call shortcutJS.bat -linkfile "%~n0.lnk" -target  "%~f0" -linkarguments "some arguments"

使用 -help 命令可以查看其他选项(例如设置图标、管理员权限等)。


2
太好了,它运行得非常好。我认为这比mklink方法更好。我使用shortcutJs.bat为.pyw文件创建快捷方式,该快捷方式与手动创建的完全相同。但是当您双击由mklink创建的链接时,它无法自动找到pythonw.exe来执行.pyw文件。 - lengxuehx
我在添加链接参数时遇到了双引号的问题,如何在参数中添加双引号? - MDuh
@MDuh - 我需要更新脚本以支持这个。可能在周末期间更新。 - npocmaka
1
非常好的解决方案,谢谢。mklink无法设置启动位置,此外,mklink需要以管理员身份运行 - undefined

12

Rohit Sahu的回答在Windows 10中对我最有效。PowerShell解决方案运行了,但没有出现快捷方式。JScript解决方案给了我语法错误。由于我不想影响权限,所以我没有尝试mklink。

我希望快捷方式出现在桌面上。 但我还需要设置图标、描述和工作目录。 请注意,MyApp48.bmp是一个48x48像素的图像。 这里是我对Rohit解决方案的修改:

@echo off
cd c:\MyApp
echo Set oWS = WScript.CreateObject("WScript.Shell") > CreateShortcut.vbs
echo sLinkFile = "%userprofile%\Desktop\MyApp.lnk" >> CreateShortcut.vbs
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
echo oLink.TargetPath = "C:\MyApp\MyApp.bat" >> CreateShortcut.vbs
echo oLink.WorkingDirectory = "C:\MyApp" >> CreateShortcut.vbs
echo oLink.Description = "My Application" >> CreateShortcut.vbs
echo oLink.IconLocation = "C:\MyApp\MyApp48.bmp" >> CreateShortcut.vbs
echo oLink.Save >> CreateShortcut.vbs
cscript CreateShortcut.vbs
del CreateShortcut.vbs

1
我想要一个非常简单的解决方案来解决一个非常简单的问题,而且我已经得到了它。我试图只使用BAT,而不是Visual Basic。 - Maslor
2
但是感谢你的回答!这可能会帮助其他寻找解决方案的人。 - Maslor
1
我在终端服务器上遇到了获取桌面路径的问题,因为用户使用了自定义桌面位置。为了解决这个问题,我不得不从注册表中读取桌面位置。`Set objShell = CreateObject("WScript.Shell")strRegDesktopPath = objShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop") desktopPath = objShell.ExpandEnvironmentStrings(strRegDesktopPath) Set oWS = WScript.CreateObject("WScript.Shell") sLinkFile = desktopPath & "\MyApp.lnk"` - Rodrigo V

9
最好的方法是运行这个批处理文件。 打开记事本并键入:-
@echo off
echo Set oWS = WScript.CreateObject("WScript.Shell") > CreateShortcut.vbs
echo sLinkFile = "GIVETHEPATHOFLINK.lnk" >> CreateShortcut.vbs
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
echo oLink.TargetPath = "GIVETHEPATHOFTARGETFILEYOUWANTTHESHORTCUT" >> CreateShortcut.vbs
echo oLink.Save >> CreateShortcut.vbs
cscript CreateShortcut.vbs
del CreateShortcut.vbs

在Win XP中,“另存为filename.bat”(保存时要小心选择所有文件类型)是有效的。


虽然我先将其转换为等效的Cygwin shell脚本,但它对我很有效。 - philwalk

6
Nirsoft的NirCMD也可以通过命令行创建快捷方式,除此之外还有许多其他功能。免费并可在此处获取:

http://www.nirsoft.net/utils/nircmd.html

完整的说明在这里:http://www.nirsoft.net/utils/nircmd2.html#using(向下滚动到“快捷方式”部分)。

是的,使用nircmd意味着您正在使用另一个第三方.exe文件,但它可以执行大多数其他解决方案中没有的一些功能(例如,在具有多个图标的dll中选择图标#,分配热键并将快捷方式目标设置为最小化或最大化)。

虽然似乎上面的shortcutjs.bat解决方案也可以完成大部分工作,但您需要更深入地挖掘以找到如何正确分配这些设置。 Nircmd可能更简单。


4
为创建 warp-cli.exe 的快捷方式,我基于rojo的Powershell命令,并添加了 WorkingDirectoryArgumentsIconLocation 和最小化 WindowStyle 属性。
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%userprofile%\Start Menu\Programs\Startup\CWarp_DoH.lnk');$s.TargetPath='E:\Program\CloudflareWARP\warp-cli.exe';$s.Arguments='connect';$s.IconLocation='E:\Program\CloudflareWARP\Cloudflare WARP.exe';$s.WorkingDirectory='E:\Program\CloudflareWARP';$s.WindowStyle=7;$s.Save()"

CreateShortcut 的其他 PS 属性:https://stackoverflow.com/a/57547816/4127357


很酷的技巧,也适用于基于用户上下文的操作,如从BAT或CMD文件。 - ZAY

3
我想提出一种不同的解决方案,这里没有提到,即使用.URL文件:
最初的回答:

我想提出一种未被提及的不同解决方案,即使用.URL文件:

set SHRT_LOCA=%userprofile%\Desktop\new_shortcut2.url
set SHRT_DEST=C:\Windows\write.exe
echo [InternetShortcut]> %SHRT_LOCA%
echo URL=file:///%SHRT_DEST%>> %SHRT_LOCA%
echo IconFile=%SHRT_DEST%>> %SHRT_LOCA%
echo IconIndex=^0>> %SHRT_LOCA%

注意事项:

  • 默认情况下,.url 文件用于打开网页,但对于任何构造正确的 URI 都可以正常工作
  • 即使在 Windows Explorer 中禁用了“隐藏已知文件类型的扩展名”选项,Microsoft Windows 也不会显示 .url 文件扩展名
  • IconFileIconIndex 是可选的
  • 您可以参考 Edward Blake 的非官方 URL 文件格式指南
注:本文是关于 IT 技术的内容。将 "Original Answer" 翻译成“最初的回答”。

1
然而,当使用 IconFile 时,即使图标文件是 *.ico 文件(索引应为0,就像示例中一样),IconIndex 也是必须的。 - Cromax
1
在Win 8.1N下,最后一行应该是“echo IconIndex=^0>> %SHRT_LOCA%”。如果没有这个符号,该行会出现在控制台中,而不是文件中,因为Cmd.EXE将“0>>”视为将echo重定向到StdOut。Handle Zero是StdIn,而StdOut是handle One,但是“^”可以转义重定向,不管输入还是输出。 - Bilbo

3

link.vbs

set fs  = CreateObject("Scripting.FileSystemObject")
set ws  = WScript.CreateObject("WScript.Shell")
set arg = Wscript.Arguments

linkFile = arg(0)

set link = ws.CreateShortcut(linkFile)
    link.TargetPath = fs.BuildPath(ws.CurrentDirectory, arg(1))
    link.Save

命令

C:\dir>link.vbs ..\shortcut.txt.lnk target.txt

2
我提供一个小型的混合脚本[BAT/VBS]来创建桌面快捷方式。当然,您可以根据自己的需求进行修改。
@echo off
mode con cols=87 lines=5 & color 9B
Title Shortcut Creator for your batch and applications files by Hackoo 2015
Set MyFile=%~f0
Set ShorcutName=HackooTest
(
echo Call Shortcut("%MyFile%","%ShorcutName%"^)
echo ^'**********************************************************************************************^)
echo Sub Shortcut(ApplicationPath,Nom^)
echo    Dim objShell,DesktopPath,objShortCut,MyTab
echo    Set objShell = CreateObject("WScript.Shell"^)
echo    MyTab = Split(ApplicationPath,"\"^)
echo    If Nom = "" Then
echo    Nom = MyTab(UBound(MyTab^)^)
echo    End if
echo    DesktopPath = objShell.SpecialFolders("Desktop"^)
echo    Set objShortCut = objShell.CreateShortcut(DesktopPath ^& "\" ^& Nom ^& ".lnk"^)
echo    objShortCut.TargetPath = Dblquote(ApplicationPath^)
echo    ObjShortCut.IconLocation = "Winver.exe,0"
echo    objShortCut.Save
echo End Sub
echo ^'**********************************************************************************************
echo ^'Fonction pour ajouter les doubles quotes dans une variable
echo Function DblQuote(Str^)
echo    DblQuote = Chr(34^) ^& Str ^& Chr(34^)
echo End Function
echo ^'**********************************************************************************************
) > Shortcutme.vbs
Start /Wait Shortcutme.vbs
Del Shortcutme.vbs
::***************************************Main Batch*******************************************
cls
echo Done and your main batch goes here !
echo i am a test 
Pause > Nul
::********************************************************************************************

1
我创建了一个VB脚本,并从命令行或Java进程中运行它。 我还尝试捕获创建快捷方式时的错误,以便进行更好的错误处理。
Set oWS = WScript.CreateObject("WScript.Shell")
shortcutLocation = Wscript.Arguments(0)

'error handle shortcut creation
On Error Resume Next
Set oLink = oWS.CreateShortcut(shortcutLocation)
If Err Then WScript.Quit Err.Number

'error handle setting shortcut target
On Error Resume Next
oLink.TargetPath = Wscript.Arguments(1)
If Err Then WScript.Quit Err.Number

'error handle setting start in property
On Error Resume Next
oLink.WorkingDirectory = Wscript.Arguments(2)
If Err Then WScript.Quit Err.Number

'error handle saving shortcut
On Error Resume Next
oLink.Save
If Err Then WScript.Quit Err.Number

我用以下命令运行脚本:

cscript /b script.vbs shortcutFuturePath targetPath startInProperty

在某些情况下,即使没有设置“启动位置”属性,也可以使其正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接