【问题标题】:How do I create a shortcut via command-line in Windows?如何在 Windows 中通过命令行创建快捷方式?
【发布时间】:2015-05-04 11:13:12
【问题描述】:

我希望我的 .bat 脚本 (test.bat) 为其自身创建一个快捷方式,以便我可以将其复制到我的 Windows 8 启动文件夹中。

我已经编写了这行代码来复制文件,但我还没有找到创建上述快捷方式的方法,因为您可以看到它只复制脚本。

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

你能帮帮我吗?

【问题讨论】:

标签: windows batch-file windows-8 cmd shortcut


【解决方案1】:

您可以使用 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 /? 了解完整语法,查看this web page 了解更多信息。

在您的批处理脚本中,执行以下操作:

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

创建的快捷方式不是传统的 .lnk 文件,但它应该可以正常工作。请注意,这仅在 .bat 文件从与您的启动文件夹相同的驱动器中运行时才有效。此外,显然需要管理员权限才能创建符号链接。

【讨论】:

  • 啊。+1。忘记了mklink。虽然它在 vista 及更高版本上受支持(无论如何 XP 都在通往墓地的路上)并且选项并不那么丰富。 Powershell 解决方案要好得多:)
  • 是的,但是如果 powershell 还没有为当前的 Windows 会话准备好,它会导致一秒钟的暂停。您的shortcutJS.bat 解决方案应该更快。
  • 我认为 mklink 解决方案对于我正在做的当前项目来说已经足够了,我认为不需要更好但更复杂的命令。但是我需要绕过一些东西:管理员权限。 mklink 中是否有配置用户权限的选项?
  • 使用组策略编辑器可以根据this page修改Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment。还有一种方法可以使用chunk of VB Script 为 UAC 提供脚本提示。老实说,我认为 PowerShell 命令或 npocmaka 的 shortcutJS.bat 解决方案将带来最佳的用户体验。
  • 文件系统符号链接适用于将通过ShellExecuteEx 或运行CreateProcess 硬代码运行%ComSpec% 命令解释器的bat/cmd 脚本运行/打开的文件。但它不适用于查找与应用程序目录相关的资源的 .exe(特别是 PE 可执行文件,无论扩展名如何)。因此,除非在同一目录中创建链接(例如 prog.2.0.exe => prog.exe),否则 .lnk 快捷方式通常是更好的解决方案。
【解决方案2】:

不能使用纯批处理。检查shortcutJS.bat - 它是jscript/bat 混合,应与.bat 扩展一起使用:

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

使用-help,您可以检查其他选项(您可以设置图标、管理员权限等)

【讨论】:

  • 太好了,效果很好。我认为它比 mklink 方法更好。我使用shortcutJs.bat 为.pyw 文件创建快捷方式,该快捷方式与手动创建的快捷方式完全相同。但是当你双击mklink创建的链接时,它无法自动找到pythonw.exe来执行.pyw文件。
  • 我在链接参数中添加双引号时遇到问题,如何在参数中添加双引号?
  • @MDuh - 我必须更新脚本才能支持这一点。可能在周末。
【解决方案3】:

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

【讨论】:

  • 我想要一个非常简单的解决方案来解决一个非常简单的问题,我已经得到了它。我试图只使用 BAT,而不是 Visual Basic。
  • 但是感谢您的回答!可能会帮助其他来这里寻找解决方案的人。
  • 在用户使用自定义桌面位置的终端服务器中获取桌面路径时遇到问题。为了解决这个问题,我不得不从注册表中读取桌面位置。 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"
【解决方案4】:

最好的方法是运行这个批处理文件。 打开记事本并输入:-

@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

另存为文件名.bat(保存选择所有文件类型时要小心) 在 win XP 中运行良好。

【讨论】:

  • 对我有用,尽管我先将其转换为等效的 cygwin shell 脚本。
【解决方案5】:

Nirsoft 的 NirCMD 也可以从命令行创建快捷方式。 (以及一堆其他功能。)在这里免费提供:

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

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

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

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

【讨论】:

    【解决方案6】:

    链接.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
    

    【讨论】:

      【解决方案7】:

      我提供了一个小型混合脚本 [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
      ::********************************************************************************************
      

      【讨论】:

        【解决方案8】:

        我想提出不同的解决方案,这里没有提到使用.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 资源管理器中的“隐藏已知文件类型的扩展名”选项被禁用,Microsoft Windows 也不显示 .url 文件扩展名
        • IconFileIconIndex 是可选的
        • 作为参考,您可以查看 Edward Blake 的 An Unofficial Guide to the URL File Format

        【讨论】:

        • 然而,当使用IconFile 时,IconIndex 是强制性的,即使图标文件是 *.ico 文件(此时索引应该为 0,就像在示例中一样)。跨度>
        • 至少在 Win 8.1N 下,最后一行应该是“echo IconIndex=^0>> %SHRT_LOCA%”。否则,该行将在控制台中结束,而不是在文件中,因为 Cmd.EXE 将“0>>”视为将回显重定向到 StdOut。句柄零是 StdIn,StdOut 是句柄一,但“^”无论如何都会转义重定向。
        【解决方案9】:

        为创建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

        【讨论】:

          【解决方案10】:

          我创建了一个 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
          

          在某些情况下,即使不设置“Start in”属性也可以让它工作。

          【讨论】:

            【解决方案11】:

            根据 Rohit 的回答,我创建了这个接受输入参数的批处理脚本:AppPathAppNameAppExtensionShortcutDestinationPath

            MakeShortcut.bat:

            @echo off
            
            set AppPath=%~1
            set AppName=%~2
            set AppExtension=%~3
            set ShortcutDestinationPath=%~4
            
            cd %AppPath%
            echo Set oWS = WScript.CreateObject("WScript.Shell") > CreateShortcut.vbs
            echo sLinkFile = "%ShortcutDestinationPath%\%AppName%.lnk" >> CreateShortcut.vbs
            echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
            echo oLink.TargetPath = "%AppPath%\%AppName%.%AppExtension%" >> CreateShortcut.vbs
            echo oLink.WorkingDirectory = "%AppPath%" >> CreateShortcut.vbs
            echo oLink.Description = "%AppName%" >> CreateShortcut.vbs
            echo oLink.IconLocation = "%AppPath%\%AppName%.bmp" >> CreateShortcut.vbs
            echo oLink.Save >> CreateShortcut.vbs
            cscript CreateShortcut.vbs
            rem del CreateShortcut.vbs
            

            在文件夹C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp中创建C:\Apps\MyApp.exe的快捷方式的用法示例:

            MakeShortcut.bat "C:\Apps" "MyApp" "exe" "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-05-06
              • 2020-10-15
              • 2013-04-29
              • 2012-05-12
              • 2021-12-30
              相关资源
              最近更新 更多