Como criar um atalho usando PowerShell

90

Quero criar um atalho com o PowerShell para este executável:

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

Como isso pode ser feito?

cethint
fonte
2
Se você deseja executar um Atalho como administrador, pode usar esta resposta .
JPBlanc
Você deve considerar seriamente aceitar a resposta do @JPBlanc. É um one liner
Kolob Canyon
@KolobCanyon Cuidado, minha resposta é um link simbólico, não um atalho.
JPBlanc

Respostas:

138

Não conheço nenhum cmdlet nativo no PowerShell, mas você pode usar o objeto com em vez disso:

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

você pode criar um script do PowerShell salvo como set-shortcut.ps1 em seu $ pwd

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

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

e chamá-lo assim

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

Se você quiser passar argumentos para o exe de destino, isso pode ser feito:

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

antes de $ Shortcut.Save ().

Por conveniência, aqui está uma versão modificada de set-shortcut.ps1. Ele aceita argumentos como seu 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.
fonte
1
Muito menor, mas apenas por uma questão de consistência, eu teria a sintaxe do Set-ShortCutcmdlet para ser mais semelhante MKLINK, ou Set-Aliasonde o alias ou link vem como primeiro argumento e depois como destino. param ( [string]$LinkPath, [string]$TargetPath )
orad
Uma limitação do componente WshShell COM ou das cmd /c mklinksoluções alternativas é um conjunto de caracteres muito limitado para nomear o arquivo .lnk. Um nome contendo → falhará, por exemplo. Uma maneira de contornar isso, se você precisar de melhor suporte a caracteres, é [Web.HttpUtility]::UrlEncode()(após Add-Type -AN System.Web) o nome do arquivo ao criar o arquivo .lnk e, em seguida, renomeá-lo para o nome UrlDecoded usando Rename-Item.
brianary
Ao criar um atalho na área de trabalho real (ao contrário de assumir um caminho embutido em código que pode ou não ser verdadeiro, uma prática incorreta que observei muitas vezes), o SpecialFoldersmétodo de um objeto WScript pode ser útil: $WshShell.SpecialFolders("Desktop")fornecerá a você o caminho verdadeiro para a pasta da área de trabalho, que você pode usar posteriormente ao chamar CreateShortcut.
amn
Eu usei esse método com PS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). Ele criou um atalho que pode ser visto no Windows Explorer, mas quando eu digitei cd homeo próprio PS recebo um errocd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp
44

Começando PowerShell 5.0 New-Item, Remove-Iteme Get-ChildItemforam aprimorados para apoiar a criação e gestão de links simbólicos. O ItemType parâmetro para New-Itemaceita um novo valor, SymbolicLink. Agora você pode criar links simbólicos em uma única linha executando o cmdlet New-Item.

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

Tenha cuidado a link simbólico é diferente de um atalho , os atalhos são apenas um arquivo. Eles têm um tamanho (Um pequeno, que apenas faz referência para onde apontam) e requerem um aplicativo para suportar esse tipo de arquivo para serem usados. Um link simbólico é o nível do sistema de arquivos e tudo o vê como o arquivo original. Um aplicativo não precisa de suporte especial para usar um link simbólico.

De qualquer forma, se você deseja criar um atalho Run As Administrator usando o Powershell, você pode 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)

Se alguém quiser alterar algo em um arquivo .LNK, consulte a documentação oficial da Microsoft .

JPBlanc
fonte
4
É possível definir também o ícone do atalho?
orad
6
Um link simbólico é muito diferente de um atalho. Um link simbólico criado usando New-Itemem "${env:AppData}\Microsoft\Windows\SendTo"não será exibido no menu Enviar para do Explorer, por exemplo, e não permite a personalização de propriedades de atalho, como ícone ou diretório de trabalho.
brianary
Se bem entendi, se você definir um link simbólico, o atalho pode ser usado de qualquer shell e de qualquer diretório. É mais ou menos como definir uma var do sistema. Isso está correto? Você também pode usá-lo para diretórios?
Ben Carp,
1
É surpreendente como PowerShell Dev está em vez de nos escrever contorcido e código incompreensível como mostrado acima, em vez de apenas implementar as 3 linhas em um novo parâmetro como este: New-Item -ItemType SymbolicLink -RunAsAdmin ....
not2qubit
1
@Luke, mas é claro, é um link do explorer, então quando você clica duas vezes nele, ele inicia calc.exe. Isso acontece quando você o inicia com o PowerShell ( & C:\temp\calc.lnk). O que você espera?
JPBlanc