Cómo crear un acceso directo usando PowerShell

90

Quiero crear un acceso directo con PowerShell para este ejecutable:

C:\Program Files (x86)\ColorPix\ColorPix.exe

¿Cómo se puede hacer esto?

cethint
fuente
2
Si desea ejecutar un acceso directo como administrador, puede usar esta respuesta .
JPBlanc
Debería considerar seriamente aceptar la respuesta de @ JPBlanc. Es un trazador de líneas
Kolob Canyon
@KolobCanyon Ten cuidado, mi respuesta es un enlace simbólico, no un atajo.
JPBlanc

Respuestas:

139

No conozco ningún cmdlet nativo en powershell, pero puede usar el objeto com en su lugar:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"
$Shortcut.Save()

puede crear un script de PowerShell guardar como set-shortcut.ps1 en su $ pwd

param ( [string]$SourceExe, [string]$DestinationPath )

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Save()

y llámalo así

Set-ShortCut "C:\Program Files (x86)\ColorPix\ColorPix.exe" "$Home\Desktop\ColorPix.lnk"

Si desea pasar argumentos al exe de destino, puede hacerlo de la siguiente manera:

#Set the additional parameters for the shortcut  
$Shortcut.Arguments = "/argument=value"  

antes de $ Shortcut.Save ().

Para mayor comodidad, aquí hay una versión modificada de set-shortcut.ps1. Acepta argumentos como segundo parámetro.

param ( [string]$SourceExe, [string]$ArgumentsToSourceExe, [string]$DestinationPath )
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Arguments = $ArgumentsToSourceExe
$Shortcut.Save()
CB.
fuente
1
Muy menor, pero solo en aras de la coherencia, tendría la sintaxis del Set-ShortCutcmdlet para ser más parecida MKLINK, o Set-Aliasdonde el alias o el enlace aparece como primer argumento y luego como destino. param ( [string]$LinkPath, [string]$TargetPath )
orad
Una limitación del componente COM de WshShell o de las cmd /c mklinksoluciones alternativas es un conjunto de caracteres muy limitado para nombrar el archivo .lnk. Un nombre que contenga un → fallará, por ejemplo. Una forma de evitar esto, si necesita un mejor soporte de caracteres, es [Web.HttpUtility]::UrlEncode()(después Add-Type -AN System.Web) del nombre del archivo mientras crea el archivo .lnk, luego renombrarlo al nombre UrlDecoded usando Rename-Item.
brianary
Al crear un acceso directo en un escritorio real (en lugar de asumir una ruta codificada que puede o no ser cierta, una negligencia que he observado muchas veces), el SpecialFoldersmétodo de un objeto WScript puede ser útil: $WshShell.SpecialFolders("Desktop")le proporcionará la ruta verdadera hacia la carpeta del escritorio, que puede utilizar posteriormente al llamar CreateShortcut.
amn
Usé este método con PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Creó un acceso directo que se puede ver desde el explorador de Windows, pero cuando escribí cd homeel PS mismo, aparece un errorcd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp
44

A partir de PowerShell 5.0 New-Item, Remove-Itemy Get-ChildItemse han mejorado para admitir la creación y administración de enlaces simbólicos. El parámetro ItemType para New-Itemacepta un nuevo valor, SymbolicLink. Ahora puede crear vínculos simbólicos en una sola línea ejecutando el cmdlet New-Item.

New-Item -ItemType SymbolicLink -Path "C:\temp" -Name "calc.lnk" -Value "c:\windows\system32\calc.exe"

Tenga cuidado: un SymbolicLink es diferente de un acceso directo , los accesos directos son solo un archivo. Tienen un tamaño (uno pequeño, que solo hace referencia a dónde apuntan) y requieren una aplicación que admita ese tipo de archivo para poder usarse. Un enlace simbólico es el nivel del sistema de archivos y todo lo ve como el archivo original. Una aplicación no necesita soporte especial para usar un enlace simbólico.

De todos modos, si desea crear un acceso directo Ejecutar como administrador usando Powershell, puede usar

$file="c:\temp\calc.lnk"
$bytes = [System.IO.File]::ReadAllBytes($file)
$bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON (Use –bor to set RunAsAdministrator option and –bxor to unset)
[System.IO.File]::WriteAllBytes($file, $bytes)

Si alguien quiere cambiar algo más en un archivo .LNK, puede consultar la documentación oficial de Microsoft .

JPBlanc
fuente
4
¿Es posible configurar también el icono para el acceso directo?
orad
7
Sin embargo, un enlace simbólico es muy diferente de un atajo. Un enlace simbólico creado con New-Itemin "${env:AppData}\Microsoft\Windows\SendTo"no se mostrará en el menú Enviar a de Explorer, por ejemplo, y no permite personalizar las propiedades del acceso directo como el icono o el directorio de trabajo.
brianary
Si lo entiendo correctamente, si establece un enlace simbólico, el acceso directo se puede usar desde cualquier shell y desde cualquier directorio. Es algo así como configurar una var del sistema. ¿Es esto correcto? ¿Puedes usarlo también para directorios?
Ben Carp
1
Es sorprendente la PowerShell Dev bastante tiene escríbanos contorsionada y el código incomprensible como se muestra arriba, en lugar de la aplicación de las 3 líneas en un nuevo parámetro de la siguiente manera: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit
1
@ Luke, pero por supuesto, es un enlace de explorador, así que cuando haces doble clic en él, se inicia calc.exe. Lo mismo ocurre cuando lo inicia con PowerShell ( & C:\temp\calc.lnk). Qué esperas ?
JPBlanc