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
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 .
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.
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.
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
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
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.
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);
}
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
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