Подтвердить что ты не робот

Создание ярлыка для 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

4b9b3361

Ответ 1

Ваша ссылка указывает на версию 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" 

Это говорит о том, что я призываю вас не использовать жесткие пути, такие как "Меню" Пуск ", поскольку они отличаются в локализованных версиях окон. Измените script вместо этого специальные папки.

Ответ 2

Это тот факт, что PowerShell действительно хорош, и поэтому является причиной того, чтобы избегать пакетных файлов и попасть в PowerShell подвига.

PowerShell может общаться с .NET. Например, вы можете определить местоположение рабочего стола следующим образом:

[Environment]::GetFolderPath("Desktop")

PowerShell может общаться с объектами COM, включая WScript.Shell, которые могут создавать ярлыки:

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

Итак, ваш script может выглядеть так:

$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

Использование 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 с вашего компьютера или использовать его в качестве образца, чтобы увидеть правильный формат для ярлыка.

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

При использовании 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);
   }

Ответ 8

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

shortcut -T source.exe destination.lnk

Ответ 9

В конце концов я решил написать правильный script, потому что для меня не работает решение Вам понадобятся два параметра fileLocal 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