Editing shortcut (.lnk) properties with Powershell Editing shortcut (.lnk) properties with Powershell powershell powershell

Editing shortcut (.lnk) properties with Powershell


Copy-Item $sourcepath $destination  ## Get the lnk we want to use as a template$shell = New-Object -COM WScript.Shell$shortcut = $shell.CreateShortcut($destination)  ## Open the lnk$shortcut.TargetPath = "C:\path\to\new\exe.exe"  ## Make changes$shortcut.Description = "Our new link"  ## This is the "Comment" field$shortcut.Save()  ## Save

Found the VB version of the code here:http://www.tutorialized.com/view/tutorial/Extract-the-target-file-from-a-shortcut-file-.lnk/18349


Below are the functions I use for dealing with .lnk files. They are modified versions of the functions found here as mentioned by @Nathan Hartley. I've improved Get-Shortcut to handle wildcards like * by passing strings to dir to expand them into sets of FileInfo objects.

function Get-Shortcut {  param(    $path = $null  )  $obj = New-Object -ComObject WScript.Shell  if ($path -eq $null) {    $pathUser = [System.Environment]::GetFolderPath('StartMenu')    $pathCommon = $obj.SpecialFolders.Item('AllUsersStartMenu')    $path = dir $pathUser, $pathCommon -Filter *.lnk -Recurse   }  if ($path -is [string]) {    $path = dir $path -Filter *.lnk  }  $path | ForEach-Object {     if ($_ -is [string]) {      $_ = dir $_ -Filter *.lnk    }    if ($_) {      $link = $obj.CreateShortcut($_.FullName)      $info = @{}      $info.Hotkey = $link.Hotkey      $info.TargetPath = $link.TargetPath      $info.LinkPath = $link.FullName      $info.Arguments = $link.Arguments      $info.Target = try {Split-Path $info.TargetPath -Leaf } catch { 'n/a'}      $info.Link = try { Split-Path $info.LinkPath -Leaf } catch { 'n/a'}      $info.WindowStyle = $link.WindowStyle      $info.IconLocation = $link.IconLocation      New-Object PSObject -Property $info    }  }}function Set-Shortcut {  param(  [Parameter(ValueFromPipelineByPropertyName=$true)]  $LinkPath,  $Hotkey,  $IconLocation,  $Arguments,  $TargetPath  )  begin {    $shell = New-Object -ComObject WScript.Shell  }  process {    $link = $shell.CreateShortcut($LinkPath)    $PSCmdlet.MyInvocation.BoundParameters.GetEnumerator() |      Where-Object { $_.key -ne 'LinkPath' } |      ForEach-Object { $link.$($_.key) = $_.value }    $link.Save()  }}


I don't think there's a native way.

There is this DOS util: Shortcut.exe.

You still need to copy the util to the remote system, then possibly call it using WMI to make the changes you're looking for.

I'm thinking the easier way will be to overwrite and/or create a new file.

Do you have access to these systems via a remote share?