2008-12-06 3 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

Пожалуйста, не думайте, что Файлы программы находятся в папке «C: \ Program Files». (% PROGRAMFILES% может работать, хотя).Точно так же не предполагайте, что домашний каталог пользователя находится в «C: \ Documents and Settings \% USERNAME%» (% HOMEDIR%). И Desktop не может называться Desktop. – 2009-02-12 17:26:43

+0

Есть ли решение для создания ярлыков в Windows 7? – JoeYo 2013-01-03 08:05:35

+3

@JayBazuzi это `% HomePath%` на Windows 7, 8 и Server 2012. :) – 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" 

Это говорит о том, что я настоятельно призываю вас не использовать жесткие пути, такие как «Меню« Пуск », поскольку они отличаются в локализованных версиях окон. Измените сценарий вместо этого, чтобы использовать 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 

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

В противном случае, быстрый поиск Google показывает, что есть целый ряд инструментов, третьих лиц, которые могут создавать .lnk файлы для ярлыков приложений , Я предполагаю, что вам нужно придерживаться того, что доступно на Windows, хотя? VBscript, вероятно, лучший выбор, иначе я бы предложил попробовать скопировать файл .lnk с вашего компьютера или использовать его в качестве образца, чтобы увидеть правильный формат для ярлыка.

1

Дополнительная Примечание: link.bat вы используете для Windows, только 95/98:

Этот командный файл для Windows, только 95/98. В ближайшее время я отправлю эквивалент NT в группе новостей NT.

Версия NT размещена на http://www.robvanderwoude.com/amb_shortcutsnt.html. Вы можете попробовать это для использования .bat-подхода, если вы предпочитаете vbscript.

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 не может манипулировать, например, «запустить как администратор ". Они доступны только через интерфейс 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 арг, так что можно было бы улучшить, сделав позднее 2 optional.I только вывешиваем, потому что Эхо использования, которые могут быть полезны для некоторых , Мне нравится WSN с использованием специальных папок и 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

EDIT 24.6.14 - следующие функции добавлены: -Edit ярлык -Список свойства ярлыка -Установить/Удалить "Запуск от имени администратора" толстый

Here поддерживаемая версия сценария может быть найдена

При использовании Windows Script Host I p см 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); 
    } 
Смежные вопросы