2008-12-06 6 views
24

cómo crear un acceso directo para un archivo ejecutable de un archivo por lotes.creando un atajo para un exe de un archivo por lotes

Traté

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" 

pero no funcionó.

link.bat se puede encontrar en http://www.robvanderwoude.com/amb_shortcuts.html

+6

Por favor, no hacer supongamos que los Archivos de programa están en "C: \ Archivos de programa".(% PROGRAMFILES% puede funcionar, sin embargo). Del mismo modo, no asuma que el directorio de inicio del usuario se encuentra en "C: \ Documents and Settings \% USERNAME%" (Es% HOMEDIR%). Y Desktop no puede llamarse Desktop. –

+0

¿Hay alguna solución disponible para crear accesos directos en Windows 7? – JoeYo

+3

@JayBazuzi es '% HomePath%' en Windows 7, 8 y Server 2012. :) – wasatchwizard

Respuesta

23

Su enlace apunta a una versión de Windows 95/98 y supongo que tiene al menos Windows 2000 o XP. Debería probar la versión NT here.

Como alternativa, utilice un poco de VBScript que se puede llamar desde la línea de comandos:

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 

Guarde el archivo como createLink.vbs y llamarlo como esto para conseguir lo que originalmente intentado:

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" 

Dicho esto, le insto a no utilizar rutas codificadas como "Menú de inicio", ya que son diferentes en las versiones localizadas de Windows. Modifique el script en su lugar para usar special folders.

+1

Agregué un par de líneas para establecer el WorkingDirectory correctamente si el destino es un exe, sin eso, cualquier exe que se espera sea lanzado desde su propio directorio fallará, generalmente con un mensaje de error sin sentido. – Mason

+0

@Mason: ¿Podría publicar sus mejoras? Realmente me ayudaría – aRestless

+1

@aRestless: Lo siento, envié una edición y aparentemente fue rechazada. El mod es añadir lo siguiente justo antes de objSC.Save: Si InStr (sTargetPath, ".exe")> 0 entonces objSC.WorkingDirectory = Izquierda (sTargetPath, InStrRev (sTargetPath, "\")) End If – Mason

1

método alternativo, utilizando una utilidad de terceros:

Creating a Shortcut from the command line (batch file)

XXMKLINK:

Con XXMKLINK, se puede escribir una archivo por lotes para la instalación del software que se ha realizado mediante la instalación especializada programas. Básicamente, XXMKLINK es una herramienta que reúne varios datos de de una línea de comandos y los empaqueta en un acceso directo.

xxmklink spath opath 

where 

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

con 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

De no ser así, una rápida búsqueda en Google muestra que hay una serie de herramientas de terceros que pueden crear archivos .lnk para accesos directos a aplicaciones . Supongo que debes apegarte a las cosas que están disponibles de forma nativa en Windows. VBscript es probablemente su mejor opción; de lo contrario, le sugiero que intente copiar el archivo .lnk de su máquina o que lo use como muestra para ver el formato correcto para un archivo de acceso directo.

1

Nota adicional: la link.bat que está utilizando es sólo para Windows 95/98:

Este archivo por lotes es sólo para Windows 95/98. Voy a publicar el equivalente NT en el grupo de noticias NT pronto.

La versión NT se publica en http://www.robvanderwoude.com/amb_shortcutsnt.html en su lugar. Puede intentarlo para un enfoque .bat si lo prefiere sobre vbscript.

12

Este es el tipo de cosa que PowerShell es realmente bueno, y por lo tanto es una razón para evitar los archivos de proceso por lotes y poner en PowerShell el carro.

PowerShell puede hablar con .NET. Por ejemplo, se puede obtener la ubicación del escritorio de la siguiente manera:

[Environment]::GetFolderPath("Desktop") 

PowerShell puede hablar con COM objetos, WScript.Shell, lo que puede crear accesos directos:

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

Así que la secuencia de comandos puede tener un aspecto como:

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

accesos directos tienen una gran cantidad de ajustes que WScript.Shell no puede manipular, como el "ejecutar como admini opción "strator" Solo se puede acceder a ellos a través de la interfaz de Win32 IShellLinkDataList, lo cual es un verdadero dolor de usar, pero se puede hacer.

3

En XP escribí 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 

Toma exactamente 4 args, por lo que podría mejorarse haciendo los últimos 2 optional.I único puesto, ya que el uso de eco, que podría ser útil para algunos . Me gusta la solución de WS usando carpetas especiales y ExpandEnvironmentStrings

0

Esto funcionó para mí en Windows XP ms-dos, todavía no lo he probado en Windows 7. Es como crear un enlace simbólico en Linux.

shortcut -T source.exe destination.lnk 
+0

sin tal comando. – henginy

+0

@henginy ¿has probado el comando? Esto se hace usando "Windows Script Host". –

+0

Por supuesto, pero lo he intentado en el símbolo del sistema ya que no se especifica lo contrario. Voy a probar en WS Host también. – henginy

0

Al final me decidí a escribir el guión correcto, porque hay una solución que funciona para mí Se necesitan dos ajustes fileLocal \ primera

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% 

y segundo

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/06/14 - siguientes funcionalidades añadidas: -Edit acceso directo propiedades -Lista de un acceso directo -Set/Quitar "Ejecutar como administrador" de espesor

Here se puede encontrar una versión actualizada del script

Al usar Windows Script H ost prefiero JScript ya que permite la creación de archivos híbridos con mensajes ni tóxicos ni temporal de files.Here mi shortcutJS.bat (se puede llamado a su gusto) que le permite utilizar todas las propiedades del acceso directo:

@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); 
    } 
Cuestiones relacionadas