¿Cómo hacer un atajo desde CMD?

76

¿Cómo puedo crear un archivo de acceso directo ( .lnk) a otro archivo o ejecutable, utilizando las utilidades de línea de comandos?

Shantanu
fuente
1
No parece haber una forma directa de hacerlo. Algunas personas tienen herramientas escritas que te permiten hacerlo; Aquí hay uno de ellos . Una búsqueda en Google de "Windows crea una línea de comando de acceso directo" muestra algunas otras. (No he probado ninguno de ellos.)
Keith Thompson
@iglvzx: no estoy seguro de que la edición que hiciste sea correcta. No creo que Shantanu necesite un script por lotes; podría ser cualquier forma de crear un * .lnk en otro archivo * .exe.
alfasin
Agregué @alfasin (.ink file), ya que había cierta confusión. Revisé la pregunta para reflejar el comentario de Shantanu. Si bien proporciona una forma de hacer 'accesos directos', no responde a esta pregunta específica.
iglvzx
1
Use lo siguiente: powershell "$ s = (New-Object -COM WScript.Shell) .CreateShortcut ('% userprofile% \ Desktop \ shortcut.lnk'); $ s.TargetPath = 'C: \ Windows \'; $ s .Guardar () "Obviamente, reemplace" '% userprofile% \ Desktop \ shortcut.lnk "y" C: \ Windows \ "con su ruta de acceso directo y ruta de destino, respectivamente.
Cowlinator
@cowlinator Según lo escrito, su sugerencia no funciona.
Ploni

Respuestas:

53

Hay información muy útil en este sitio: http://ss64.com/nt/shortcut.html

Parece que hay algunos shortcut.exeen algún kit de recursos que no tengo.
Como muchos otros sitios mencionan, no hay una forma integrada de hacerlo desde un archivo por lotes.

Pero puedes hacerlo desde un script VB:

Las secciones opcionales en el VBscript a continuación se comentan:

Set oWS = WScript.CreateObject("WScript.Shell")
sLinkFile = "C:\MyShortcut.LNK"
Set oLink = oWS.CreateShortcut(sLinkFile)
    oLink.TargetPath = "C:\Program Files\MyApp\MyProgram.EXE"
 '  oLink.Arguments = ""
 '  oLink.Description = "MyProgram"   
 '  oLink.HotKey = "ALT+CTRL+F"
 '  oLink.IconLocation = "C:\Program Files\MyApp\MyProgram.EXE, 2"
 '  oLink.WindowStyle = "1"   
 '  oLink.WorkingDirectory = "C:\Program Files\MyApp"
oLink.Save

Entonces, si realmente debe hacerlo, entonces podría hacer que su archivo por lotes escriba el script VB en el disco, invocarlo y luego eliminarlo nuevamente. Por ejemplo, así:

@echo off
echo Set oWS = WScript.CreateObject("WScript.Shell") > CreateShortcut.vbs
echo sLinkFile = "%HOMEDRIVE%%HOMEPATH%\Desktop\Hello.lnk" >> CreateShortcut.vbs
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> CreateShortcut.vbs
echo oLink.TargetPath = "C:\Windows\notepad.exe" >> CreateShortcut.vbs
echo oLink.Save >> CreateShortcut.vbs
cscript CreateShortcut.vbs
del CreateShortcut.vbs

Ejecutar el script anterior da como resultado un nuevo acceso directo en mi escritorio:
Atajo resultante

Aquí hay un fragmento más completo de un colaborador anónimo (actualizado con una corrección menor):

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET LinkName=Hello
SET Esc_LinkDest=%%HOMEDRIVE%%%%HOMEPATH%%\Desktop\!LinkName!.lnk
SET Esc_LinkTarget=%%SYSTEMROOT%%\notepad.exe
SET cSctVBS=CreateShortcut.vbs
SET LOG=".\%~N0_runtime.log"
((
  echo Set oWS = WScript.CreateObject^("WScript.Shell"^) 
  echo sLinkFile = oWS.ExpandEnvironmentStrings^("!Esc_LinkDest!"^)
  echo Set oLink = oWS.CreateShortcut^(sLinkFile^) 
  echo oLink.TargetPath = oWS.ExpandEnvironmentStrings^("!Esc_LinkTarget!"^)
  echo oLink.Save
)1>!cSctVBS!
cscript //nologo .\!cSctVBS!
DEL !cSctVBS! /f /q
)1>>!LOG! 2>>&1
Der Hochstapler
fuente
1
Relacionado: MSDN, Shell Links
iglvzx
Esto funciona muy bien para el acceso directo a un archivo. Sin embargo, tengo un problema extraño al usarlo como acceso directo a una carpeta, cuando mi variable Esc_LinkTarget contiene una variable de entorno que intenta obtener su carpeta principal. (Algo así como% CD% \ .. no funciona, pero% CD% funciona). El tipo de destino de acceso directo se convierte en 'Archivo' en lugar de 'Carpeta'
EDM
1
@Edmund Problema interesante. No tengo tiempo para investigarlo, pero supongo que un corte final podría marcar la diferencia.
Der Hochstapler
Nota: si utiliza SET Esc_LinkTarget=%0entonces usted tiene que quitar el "deecho oLink.TargetPath = oWS.ExpandEnvironmentStrings^(!Esc_LinkTarget!^)
Negro
En lugar de crear un vbscript para cada ejecución, hubiera sido mucho mejor usarlo Wscript.Argumentspara obtener los argumentos de la línea de comando ... jajaja
Sancarn
22

Aquí hay una solución similar usando powershell (lo sé, probablemente puedas reescribir todo tu archivo por lotes en PS, pero si solo quieres Get It Done ™ ...)

set TARGET='D:\Temp'
set SHORTCUT='C:\Temp\test.lnk'
set PWS=powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile

%PWS% -Command "$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut(%SHORTCUT%); $S.TargetPath = %TARGET%; $S.Save()"

Puede que tenga que especificar explícitamente la ruta a PS en su archivo, pero debería funcionar. También hay algunos atributos adicionales que puede modificar a través de este objeto:

Name             MemberType Definition                             
----             ---------- ----------                             
Load             Method     void Load (string)                     
Save             Method     void Save ()                           
Arguments        Property   string Arguments () {get} {set}        
Description      Property   string Description () {get} {set}      
FullName         Property   string FullName () {get}               
Hotkey           Property   string Hotkey () {get} {set}           
IconLocation     Property   string IconLocation () {get} {set}     
RelativePath     Property   string RelativePath () {set}           
TargetPath       Property   string TargetPath () {get} {set}       
WindowStyle      Property   int WindowStyle () {get} {set}         
WorkingDirectory Property   string WorkingDirectory () {get} {set} 
SmallClanger
fuente
Trix : Si crees que tienes una mejor manera de hacerlo , simplemente publícalo como una nueva respuesta (si es apropiado, vincúlala a esta).
Scott, el
17

Además de shortcut.exe, también puede usar la versión de línea de comandos de NirCmd para crear un acceso directo. http://nircmd.nirsoft.net/shortcut.html

Mientras bucle
fuente
11
Recomiendo casi todo de NirSoft, es el conjunto de herramientas geek definitivo
ese chico brasileño el
10

¿Qué tal usar el comando mklink? C: \ Windows \ System32> mklink Crea un enlace simbólico.

MKLINK [[/ D] | [/ H] | [/ J]] Objetivo de enlace

    /D      Creates a directory symbolic link.  Default is a file
            symbolic link.
    /H      Creates a hard link instead of a symbolic link.
    /J      Creates a Directory Junction.
    Link    specifies the new symbolic link name.
    Target  specifies the path (relative or absolute) that the new link
            refers to.
Miguel
fuente
10
Buena idea, pero los enlaces simbólicos parecen comportarse de manera un poco diferente a los accesos directos. Si creo un acceso directo a una solución de Visual Studio, abre todos los proyectos relativamente corregidos correctamente. Sin embargo, si abro la misma solución a través de un enlace simbólico, el directorio de trabajo es el de la ruta en la que reside el enlace simbólico, no la ruta a la que se refiere.
Walter Stabosz
7

Después de todas las discusiones que tuvimos aquí, esta es mi solución sugerida: descargue: http://optimumx.com/download/Shortcut.zip, extráigala en su escritorio (por ejemplo). Ahora, suponga que desea crear un acceso directo para un archivo llamado scrum.pdf (también en el escritorio):
1. abra CMD y vaya a la carpeta del escritorio
2. ejecute:Shortcut.exe /f:"%USERPROFILE%\Desktop\sc.lnk" /a:c /t:%USERPROFILE%\Desktop\scrum.pdf

creará un acceso directo llamado sc.lnk en su escritorio que apuntará al archivo original (scrum.pdf)

alfasin
fuente
Eso no es un atajo; es solo un archivo por lotes que invoca un programa específico.
Keith Thompson
1
un atajo es algo que se ejecuta desde Windows, ya que usó CMD en el título y puso la etiqueta "línea de comando". Supuse que quería ejecutarlo desde CMD. Un archivo por lotes es el equivalente de un "acceso directo" de Windows cuando se ejecuta en CMD (dos like) env.
alfasin
2
Como puso "acceso directo (archivo .lnk)" en el cuerpo de la pregunta, supuse que quiere crear un acceso directo real.
Keith Thompson
1
perdón por la claridad, quería tener un icono en mi escritorio que hice en cmd que sería un acceso directo a un archivo exe
Shantanu
ahora que finalmente entendí (pensador lento, qué puedes hacer ...) cambié mi respuesta. ¡Espero eso ayude!
alfasin
0

Este programa gratuito requiere la funcionalidad http://www.nirsoft.net/utils/nircmd2.html : (muestra de dicha página web) "Create a shortcut to Windows calculator under Start Menu->Programs->Calculators nircmd.exe shortcut "f:\winnt\system32\calc.exe" "~$folder.programs$\Calculators" "Windows Calculator"

Mi propia muestra para probar: acceso directo nircmd.exe "c: \ windows \ system32 \ calc.exe" "~ $ folder.desktop $" "Calculadora de Windows"

Goldie
fuente
0

Sé que este tema es antiguo, pero quería proporcionar la solución simple que funcionó para mí.

Primero copié el archivo .ico en mi unidad C:. Luego creé el acceso directo en mi escritorio y configuré el ícono en el archivo ico en mi unidad C :. Luego copié el .ico y el acceso directo a un recurso compartido de red al que mis usuarios tienen acceso. Una vez allí, escribí el siguiente archivo por lotes para copiar el ico y .url en el escritorio de Windows 7 de los usuarios. Esto crea el acceso directo en el escritorio de todos los usuarios y mantiene el archivo de icono que configuré al crear el acceso directo. Espero que esto ayude a alguien.

@echo off
Copy "\\sharename\folder\icon.ico" "C:\"
pause
copy "\\sharename\folder\shortcut.url" "C:\Users\All Users\Desktop"
pause
Michele
fuente
Si este es el enfoque a seguir, es mejor crear el acceso directo real (.lnk) que incrusta el icono en él. Ese acceso directo se puede copiar en todas partes.
LPChip