2008-12-06 102 views
24

如何從批處理文件創建EXE的快捷方式。從批處理文件創建EXE的快捷方式

我試圖

call link.bat "c:\program Files\App1\program1.exe" "C:\Documents and Settings\%USERNAME%\Desktop" "C:\Documents and Settings\%USERNAME%\Start Menu\Programs" "Program1 shortcut" 

,但它並沒有奏效。

link.bat可以在 http://www.robvanderwoude.com/amb_shortcuts.html

+6

請不要假定Program Files位於「C:\ Program Files」中。(%PROGRAMFILES%可以工作,但)。同樣,不要假定用戶的主目錄位於「C:\ Documents and Settings \%USERNAME%」(它是%HOMEDIR%)。和桌面可能不稱爲桌面。 – 2009-02-12 17:26:43

+0

是否有可用於在Windows 7上創建快捷方式的解決方案? – JoeYo 2013-01-03 08:05:35

+3

@JayBazuzi它在Windows 7,8和Server 2012上是`%HomePath%`。:) – wasatchwizard 2013-10-28 18:02:02

回答

23

您的鏈接指向Windows 95/98版本,我猜你至少有Windows 2000或XP。你應該試試NT版本here

或者使用一個小的VBScript可以從命令行調用:

set objWSHShell = CreateObject("WScript.Shell") 
set objFso = CreateObject("Scripting.FileSystemObject") 

' command line arguments 
' TODO: error checking 
sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0)) 
sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1)) 
sWorkingDirectory = objFso.GetAbsolutePathName(sShortcut) 

set objSC = objWSHShell.CreateShortcut(sShortcut) 

objSC.TargetPath = sTargetPath 
objSC.WorkingDirectory = sWorkingDirectory 

objSC.Save 

將文件保存爲createLink.vbs和調用它得到什麼您最初試圖:

cscript createLink.vbs "C:\Documents and Settings\%USERNAME%\Desktop\Program1 shortcut.lnk" "c:\program Files\App1\program1.exe" 
cscript createLink.vbs "C:\Documents and Settings\%USERNAME%\Start Menu\Programs\Program1 shortcut.lnk" "c:\program Files\App1\program1.exe" 

這就是說我敦促你不要使用像「開始菜單」這樣的硬編碼路徑,因爲它們在本地化版本的Windows中不同。修改腳本代替使用special folders

1

替代方法可以發現,使用第三方工具:

Creating a Shortcut from the command line (batch file)

XXMKLINK:

隨着XXMKLINK,你可以寫一個用於軟件的批處理文件 已通過專門安裝完成安裝 程序。基本上,XXMKLINK是一種從命令行收集各種信息並將其打包成快捷方式的工具。

xxmklink spath opath 

where 

    spath  path of the shortcut (.lnk added as needed) 
    opath  path of the object represented by the shortcut 
10

使用VBScript:

set WshShell = WScript.CreateObject("WScript.Shell") 
strDesktop = WshShell.SpecialFolders("AllUsersDesktop") 
set oShellLink = WshShell.CreateShortcut(strDesktop & "\shortcut name.lnk") 
oShellLink.TargetPath = "c:\application folder\application.exe" 
oShellLink.WindowStyle = 1 
oShellLink.IconLocation = "c:\application folder\application.ico" 
oShellLink.Description = "Shortcut Script" 
oShellLink.WorkingDirectory = "c:\application folder" 
oShellLink.Save 

編號:http://www.tomshardware.com/forum/52871-45-creating-desktop-shortcuts-command-line

做不到這一點,一個快速谷歌搜索結果顯示,有一些第三方工具可以創建的.lnk的應用程序快捷方式文件。我假設你需要堅持自己在Windows上可用的東西? VBscript可能是您最好的選擇,否則我會建議您從機器上覆制.lnk文件或將它用作示例以查看快捷方式文件的正確格式。

1

附加說明:您使用的是link.bat僅適用於Windows 95/98:

此批處理文件是僅適用於Windows 95/98。我將盡快在NT新聞組上發佈相當於 的新臺幣。

NT版發佈在http://www.robvanderwoude.com/amb_shortcutsnt.html。如果優先於vbscript,您可以嘗試使用.bat方法。

12

這是PowerShell真正擅長的事情,因此是避免批處理文件並使其成爲PowerShell的原因。

PowerShell可以與.NET對話。例如,你可以在桌面的位置是這樣的:

[Environment]::GetFolderPath("Desktop") 

的PowerShell可以跟COM對象,包括WScript.Shell,它可以創建快捷方式:

New-Object -ComObject WScript.Shell).CreateShortcut(...) 

所以,你的腳本可能看起來像:

$linkPath = Join-Path ([Environment]::GetFolderPath("Desktop")) "MyShortcut.lnk" 
$targetPath = Join-Path ([Environment]::GetFolderPath("ProgramFiles")) "MyCompany\MyProgram.exe" 
$link = (New-Object -ComObject WScript.Shell).CreateShortcut($linkpath) 
$link.TargetPath = $targetPath 
$link.Save() 

快捷方式有很多設置,WScript.Shell不能操縱,像「運行方式ADMINI選擇器「選項。這些只能通過Win32界面IShellLinkDataList訪問,這是一個真正的痛苦使用,但它可以完成。

3

在XP中,我寫makeshortcut.vbs

Set oWS = WScript.CreateObject("WScript.Shell") 
If wscript.arguments.count < 4 then 
    WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath arguments workingDir " 
    WScript.Quit 
end If 
shortcutPath = wscript.arguments(0) & ".LNK" 
targetPath = wscript.arguments(1) 
arguments = wscript.arguments(2) 
workingDir = wscript.arguments(3) 

WScript.Echo "Creating shortcut " & shortcutPath & " targetPath=" & targetPath & " arguments=" & arguments & " workingDir=" & workingDir 

Set oLink = oWS.CreateShortcut(shortcutPath) 
oLink.TargetPath = targetPath 
oLink.Arguments = arguments 
' oLink.Description = "MyProgram" 
' oLink.HotKey = "ALT+CTRL+F" 
' oLink.IconLocation = "C:\Program Files\MyApp\MyProgram.EXE, 2" 
' oLink.WindowStyle = "1" 
oLink.WorkingDirectory = workingDir 
oLink.Save 

,也恰恰是4個ARGS,因此它可以通過將後2個optional.I改善只發布,因爲它呼應的使用,這可能是一些有用的。我喜歡WS的soln使用特殊文件夾和ExpandEnvironmentStrings

0

這對我在Windows XP ms-dos上工作,我仍然沒有在Windows 7上嘗試過。它就像在Linux中創建符號鏈接一樣。

shortcut -T source.exe destination.lnk 
0

最後,我決定寫正確的腳本,因爲沒有解決方案適用於我 您將需要兩個fileLocal設置\ 第一

createSCUT.bat

@echo on 
set VBS=createSCUT.vbs 
set SRC_LNK="shortcut1.lnk" 
set ARG1_APPLCT="C:\Program Files\Google\Chrome\Application\chrome.exe" 
set ARG2_APPARG="--profile-directory=QuteQProfile 25QuteQ" 
set ARG3_WRKDRC="C:\Program Files\Google\Chrome\Application" 
set ARG4_ICOLCT="%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Profile 25\Google Profile.ico" 
cscript %VBS% %SRC_LNK% %ARG1_APPLCT% %ARG2_APPARG% %ARG3_WRKDRC% %ARG4_ICOLCT% 

和第二個

createSCUT.vbs

Set objWSHShell = WScript.CreateObject("WScript.Shell") 
set objWSHShell = CreateObject("WScript.Shell") 
set objFso = CreateObject("Scripting.FileSystemObject") 
If WScript.arguments.count = 5 then 
    WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath arguments workingDir IconLocation" 
    sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0)) 
    set objSC = objWSHShell.CreateShortcut(sShortcut) 
    sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1)) 
    sArguments = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(2)) 
    sWorkingDirectory = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(3)) 
    sIconLocation = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(4)) 
    objSC.TargetPath = sTargetPath 
    rem http://www.bigresource.com/VB-simple-replace-function-5bAN30qRDU.html# 
    objSC.Arguments = Replace(sArguments, "QuteQ", Chr(34)) 
    rem http://msdn.microsoft.com/en-us/library/f63200h0(v=vs.90).aspx http://msdn.microsoft.com/en-us/library/267k4fw5(v=vs.90).aspx 
    objSC.WorkingDirectory = sWorkingDirectory 
    objSC.Description = "Love Peace Bliss" 
    rem 1 restore 3 max 7 min 
    objSC.WindowStyle = "3" 
    rem objSC.Hotkey = "Ctrl+Alt+e"; 
    objSC.IconLocation = sIconLocation 
    objSC.Save 
    WScript.Quit 
end If 
If WScript.arguments.count = 4 then 
    WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath arguments workingDir " 

    sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0)) 
    set objSC = objWSHShell.CreateShortcut(sShortcut) 
    sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1)) 
    sArguments = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(2)) 
    sWorkingDirectory = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(3)) 
    objSC.TargetPath = sTargetPath 
    objSC.Arguments = Replace(sArguments, "QuteQ", Chr(34)) 
    objSC.WorkingDirectory = sWorkingDirectory 
    objSC.Description = "Love Peace Bliss" 
    objSC.WindowStyle = "3" 
    objSC.Save 
    WScript.Quit 
end If 
If WScript.arguments.count = 2 then 
    WScript.Echo "usage: makeshortcut.vbs shortcutPath targetPath" 
    sShortcut = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(0)) 
    set objSC = objWSHShell.CreateShortcut(sShortcut) 
    sTargetPath = objWSHShell.ExpandEnvironmentStrings(WScript.Arguments.Item(1)) 
    sWorkingDirectory = objFso.GetAbsolutePathName(sShortcut) 
    objSC.TargetPath = sTargetPath 
    objSC.WorkingDirectory = sWorkingDirectory 
    objSC.Save 
    WScript.Quit 
end If 
1

編輯14年6月24日 - 以下功能補充說: - 編輯快捷厚

快捷 - 設置/刪除 「以管理員身份運行」 的 - 列出性質

Here一個維護版本的腳本可以找到

當使用Windows腳本H OST我喜歡的JScript,因爲它允許創建既不有毒的消息,也沒有臨時files.Here的我shortcutJS.bat的混合文件(只要你喜歡,你可以把它命名爲)允許您使用的所有快捷方式的屬性:

@if (@X)==(@Y) @end /* JScript comment 
@echo off 

cscript //E:JScript //nologo "%~f0" "%~nx0" %* 

exit /b %errorlevel% 
@if (@X)==(@Y) @end JScript comment */ 


    var args=WScript.Arguments; 
    var scriptName=args.Item(0); 
    //var adminPermissions= false; 
    var edit= false; 

    function printHelp() { 
    WScript.Echo(scriptName + " -linkfile link -target target [-linkarguments linkarguments] "+ 
    " [-description description] [-iconlocation iconlocation] [-hotkey hotkey] "+ 
    " [-windowstyle 1|3|7] [-workingdirectory workingdirectory] [-adminpermissions yes|no]"); 
    WScript.Echo(); 
     WScript.Echo(scriptName + " -edit link [-target target] [-linkarguments linkarguments] "+ 
    " [-description description] [-iconlocation iconlocation] [-hotkey hotkey] "+ 
    " [-windowstyle 1|3|7] [-workingdirectory workingdirectory] [-adminpermissions yes|no]"); 
    WScript.Echo(); 
    WScript.Echo(scriptName + " -examine link"); 
    WScript.Echo(); 
    WScript.Echo(" More info: http://msdn.microsoft.com/en-us/library/xk6kst2k%28v=vs.84%29.aspx "); 



    } 

    // reads the given .lnk file as a char array 
    function getlnkChars(lnkPath) { 
     // :: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855&start=15&p=28898 :: 
     var ado = WScript.CreateObject("ADODB.Stream"); 
     ado.Type = 2; // adTypeText = 2 

     ado.CharSet = "iso-8859-1"; // code page with minimum adjustments for input 
     ado.Open(); 
     ado.LoadFromFile(lnkPath); 

     var adjustment = "\u20AC\u0081\u201A\u0192\u201E\u2026\u2020\u2021" + 
         "\u02C6\u2030\u0160\u2039\u0152\u008D\u017D\u008F" + 
         "\u0090\u2018\u2019\u201C\u201D\u2022\u2013\u2014" + 
         "\u02DC\u2122\u0161\u203A\u0153\u009D\u017E\u0178" ; 


     var fs = new ActiveXObject("Scripting.FileSystemObject"); 
     var size = (fs.getFile(lnkPath)).size; 

     var lnkBytes = ado.ReadText(size); 
     ado.Close(); 
     var lnkChars=lnkBytes.split(''); 
     for (var indx=0;indx<size;indx++) { 
      if (lnkChars[indx].charCodeAt(0) > 255) { 
       lnkChars[indx] = String.fromCharCode(128 + adjustment.indexOf(lnkChars[indx])); 
      } 
     } 
     return lnkChars; 

    } 


    function hasAdminPermissions(lnkPath) { 
     return (getlnkChars(lnkPath))[21].charCodeAt(0) == 32 ; 
    } 


    function setAdminPermissions(lnkPath , flag) { 
     lnkChars=getlnkChars(lnkPath); 
     var ado = WScript.CreateObject("ADODB.Stream"); 
     ado.Type = 2; // adTypeText = 2 
     ado.CharSet = "iso-8859-1"; // right code page for output (no adjustments) 
     //ado.Mode=2; 
     ado.Open(); 
     // setting the 22th byte to 32 
     if (flag) { 
      lnkChars[21]=String.fromCharCode(32); 
     } else { 
      lnkChars[21]=String.fromCharCode(0); 
     } 
     ado.WriteText(lnkChars.join("")); 
     ado.SaveToFile(lnkPath, 2); 
     ado.Close(); 

    } 

    function examine(lnkPath) { 

     var fs = new ActiveXObject("Scripting.FileSystemObject"); 
     if (!fs.FileExists(lnkPath)) { 
     WScript.Echo("File " + lnkPath + " does not exist"); 
     WScript.Quit(2); 
     } 

     var oWS = new ActiveXObject("WScript.Shell"); 
     var oLink = oWS.CreateShortcut(lnkPath); 

     WScript.Echo("");  
     WScript.Echo(lnkPath + " properties:"); 
     WScript.Echo(""); 
     WScript.Echo("Target: " + oLink.TargetPath); 
     WScript.Echo("Icon Location: " + oLink.IconLocation); 
     WScript.Echo("Description: " + oLink.Description); 
     WScript.Echo("Hotkey: " + oLink.HotKey); 
     WScript.Echo("Working Directory: " + oLink.WorkingDirectory); 
     WScript.Echo("Window style: " + oLink.WindowStyle); 
     WScript.Echo("Admin Permissions: " + hasAdminPermissions(lnkPath)); 

     WScript.Quit(0); 
    } 


    if (WScript.Arguments.Length==1 || args.Item(1).toLowerCase() == "-help" || args.Item(1).toLowerCase() == "-h") { 
    printHelp(); 
    WScript.Quit(0); 
    } 

    if (WScript.Arguments.Length % 2 == 0) { 
    WScript.Echo("Illegal arguments "); 
    printHelp(); 
    WScript.Quit(1); 
    } 

    if (args.Item(1).toLowerCase() == "-examine") { 

     var linkfile = args.Item(2); 
     examine(linkfile); 
    } 

    if (args.Item(1).toLowerCase() == "-edit") { 
     var linkfile = args.Item(2); 
     edit=true; 
    } 

    if(!edit) { 
     for (var arg = 1;arg<5;arg=arg+2) { 

      if (args.Item(arg).toLowerCase() == "-linkfile") { 
       var linkfile = args.Item(arg+1); 
      } 

      if (args.Item(arg).toLowerCase() == "-target") { 
       var target = args.Item(arg+1); 
      } 
     } 
    } 

    if (typeof linkfile === 'undefined') { 
    WScript.Echo("Link file not defined"); 
    printHelp(); 
    WScript.Quit(2); 
    } 

    if (typeof target === 'undefined' && !edit) { 
    WScript.Echo("Target not defined"); 
    printHelp(); 
    WScript.Quit(3); 
    } 


    var oWS = new ActiveXObject("WScript.Shell"); 
    var oLink = oWS.CreateShortcut(linkfile); 


    if(typeof target === 'undefined') { 
     var startIndex=3; 
    } else { 
     var startIndex=5; 
     oLink.TargetPath = target; 
    } 


    for (var arg = startIndex ; arg<args.Length;arg=arg+2) { 

     if (args.Item(arg).toLowerCase() == "-linkarguments") { 
      oLink.Arguments = args.Item(arg+1); 
     } 

     if (args.Item(arg).toLowerCase() == "-description") { 
      oLink.Description = args.Item(arg+1); 
     } 

     if (args.Item(arg).toLowerCase() == "-hotkey") { 
      oLink.HotKey = args.Item(arg+1); 
     } 

     if (args.Item(arg).toLowerCase() == "-iconlocation") { 
      oLink.IconLocation = args.Item(arg+1); 
     } 

     if (args.Item(arg).toLowerCase() == "-windowstyle") { 
      oLink.WindowStyle = args.Item(arg+1); 
     } 

     if (args.Item(arg).toLowerCase() == "-workdir") { 
      oLink.WorkingDirectory = args.Item(arg+1); 
     } 


     if (args.Item(arg).toLowerCase() == "-adminpermissions") { 
      if(args.Item(arg+1).toLowerCase() == "yes") { 
       var adminPermissions= true; 
      } else if(args.Item(arg+1).toLowerCase() == "no") { 
       var adminPermissions= false; 
      } else { 
       WScript.Echo("Illegal arguments (admin permissions)"); 
       WScript.Quit(55); 
      } 
     } 
    } 
    oLink.Save(); 

    if (!(typeof adminPermissions === 'undefined')) { 
     setAdminPermissions(linkfile ,adminPermissions); 
    } 
相關問題