web-dev-qa-db-fra.com

création d'un raccourci pour un exe à partir d'un fichier batch

comment créer un raccourci pour un exe à partir d'un fichier batch.

j'ai essayé

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"

mais cela n'a pas fonctionné.

link.bat peut être trouvé à http://www.robvanderwoude.com/amb_shortcuts.html

24
sundar venugopal

Votre lien pointe vers une version Windows 95/98 et je suppose que vous avez au moins Windows 2000 ou XP. Vous devriez essayer la version NT ici .

Vous pouvez également utiliser un petit VBScript que vous pouvez appeler à partir de la ligne de commande:

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

Enregistrez le fichier sous createLink.vbs et appelez-le comme ceci pour obtenir ce que vous avez essayé à l'origine:

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" 

Cela dit, je vous exhorte à ne pas utiliser de chemins codés en dur comme "Menu Démarrer" car ils sont différents dans les versions localisées de Windows. Modifiez le script à la place pour utiliser dossiers spéciaux .

23
VVS

C'est le genre de choses pour lesquelles PowerShell est vraiment bon, et c'est donc une raison pour éviter les fichiers batch et obtenir sur PowerShell le mouvement.

PowerShell peut parler à .NET. Par exemple, vous pouvez obtenir l'emplacement du bureau comme ceci:

[Environment]::GetFolderPath("Desktop")

PowerShell peut parler à COM objets, y compris WScript.Shell, qui peut créer des raccourcis:

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

Votre script pourrait donc ressembler à:

$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()

Les raccourcis ont de nombreux paramètres que WScript.Shell ne peut pas manipuler, comme l'option "exécuter en tant qu'administrateur". Ceux-ci ne sont accessibles que via l'interface Win32 IShellLinkDataList, ce qui est vraiment difficile à utiliser, mais cela peut être fait.

12
Jay Bazuzi

Utilisation de 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 

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

À défaut, une recherche rapide sur Google montre qu'il existe un certain nombre d'outils tiers qui peuvent créer des fichiers .lnk pour les raccourcis d'application. Je suppose que vous devez vous en tenir aux choses disponibles en natif sur Windows? VBscript est probablement votre meilleur pari, sinon je vous suggère d'essayer de copier le fichier .lnk depuis votre machine ou de l'utiliser comme exemple pour voir le format correct pour un fichier de raccourci.

10
Jay

Sur XP j'ai écrit rend raccourci.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

Il prend exactement 4 arguments, il pourrait donc être amélioré en rendant les 2 derniers optionnels. Je ne poste que parce qu'il fait écho à l'utilisation, ce qui pourrait être utile à certains. J'aime la solution de WS en utilisant des dossiers spéciaux et ExpandEnvironmentStrings

3
Martin yarwood

Méthode alternative, utilisant un utilitaire tiers:

Création d'un raccourci à partir de la ligne de commande (fichier batch)

XXMKLINK:

Avec XXMKLINK, vous pouvez écrire un fichier batch pour l'installation du logiciel qui a été fait par des programmes d'installation spécialisés. Fondamentalement, XXMKLINK est un outil qui rassemble diverses informations à partir d'une ligne de commande et les regroupe dans un raccourci.

xxmklink spath opath 

where 

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

Remarque supplémentaire: le lien.bat que vous utilisez est uniquement pour Windows 95/98:

Ce fichier de commandes concerne uniquement Windows 95/98. Je publierai bientôt l'équivalent NT dans le groupe de discussion NT.

La version NT est publiée sur http://www.robvanderwoude.com/amb_shortcutsnt.html à la place. Vous pouvez essayer cela pour une approche .bat si vous préférez vbscript.

1
Jay

EDIT 24.6.14 - Les fonctionnalités suivantes ont été ajoutées: -Edit shortcut -List properties of a shortcut -Set/Remove "Run as administrator" thick

Ici une version maintenue du script peut être trouvée

Lorsque j'utilise Windows Script Host, je préfère jscript car il permet de créer des fichiers hybrides sans messages toxiques ni fichiers temporaires.Voici mon raccourciJS.bat (vous pouvez le nommer comme vous le souhaitez) vous permettant d'utiliser toutes les propriétés de raccourci:

@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
npocmaka

Cela a fonctionné pour moi sur Windows XP ms-dos, je ne l'ai toujours pas essayé sur Windows 7. C'est comme créer un lien symbolique sous Linux.

shortcut -T source.exe destination.lnk
0
Gabriel Ramirez

En fin de compte, j'ai décidé d'écrire le script correct, car aucune solution ne fonctionne pour moi. Vous aurez besoin de deux paramètres FileLocal\first

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%

et deuxieme

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