создание ярлыка для exe из командного файла - PullRequest
24 голосов
/ 06 декабря 2008

как создать ярлык для 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

Ответы [ 9 ]

23 голосов
/ 06 декабря 2008

Ваша ссылка указывает на версию Windows 95/98, и я думаю, что у вас есть по крайней мере Windows 2000 или XP. Вы должны попробовать версию NT здесь .

В качестве альтернативы используйте небольшой 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" 

Тем не менее я призываю вас не использовать жестко закодированные пути, такие как «Пуск», поскольку они отличаются в локализованных версиях окон. Вместо этого измените скрипт, чтобы использовать специальные папки .

12 голосов
/ 12 февраля 2009

Это то, с чем 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, что очень неудобно, но это возможно.

10 голосов
/ 06 декабря 2008

Использование 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

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

3 голосов
/ 17 ноября 2010

На XP я написал makehortcut.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 последними необязательными. Я пишу только потому, что это эхо, что может быть полезно для некоторых. Мне нравится soln WS с использованием специальных папок и ExpandEnvironmentStrings

1 голос
/ 21 июня 2014

РЕДАКТИРОВАТЬ 24.6.14 - Добавлены следующие функции: Редактировать ярлык -Список свойств ярлыка -Установить / убрать «Запуск от имени администратора» толщиной

Здесь можно найти поддерживаемую версию скрипта

При использовании Windows Script Host я предпочитаю jscript, поскольку он позволяет создавать гибридные файлы без токсичных сообщений и временных файлов. Вот мой 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);
   }
1 голос
/ 06 декабря 2008

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

Этот пакетный файл предназначен только для Windows 95/98. Я опубликую эквивалент NT в скоро новостная группа NT.

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

1 голос
/ 06 декабря 2008

Альтернативный метод с использованием сторонней утилиты:

Создание ярлыка из командной строки (командный файл)

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
0 голосов
/ 06 октября 2013

В конце концов я решил написать правильный сценарий, потому что у меня нет решения Вам понадобятся два файла Local Settings \ первый

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
0 голосов
/ 17 марта 2012

Это работало для меня в Windows XP ms-dos, я до сих пор не пробовал это в Windows 7. Это похоже на создание символической ссылки в Linux.

shortcut -T source.exe destination.lnk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...