web-dev-qa-db-fra.com

Modification des propriétés de raccourci (.lnk) avec Powershell

J'ai trouvé un moyen désagréable de faire cela, mais je suis à la recherche d'une procédure PoSh native pour modifier les propriétés d'un fichier .LNK. L’objectif est d’atteindre des ordinateurs distants, de dupliquer un raccourci existant avec la plupart des propriétés correctes et d’en éditer quelques-uns.

S'il était simplement plus facile d'écrire un nouveau fichier de raccourci, cela fonctionnerait aussi.

23
Doug Chase
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

Trouvez la version VB du code ici: http://www.tutorialized.com/view/tutorial/Extract-the-target-file-from-a-shortcut-file-.lnk/18349

30
JasonMArcher

Vous trouverez ci-dessous les fonctions que j'utilise pour traiter les fichiers .lnk. Ce sont des versions modifiées des fonctions trouvées ici comme mentionné par @Nathan Hartley. J'ai amélioré Get-Shortcut pour gérer les caractères génériques comme * en passant des chaînes à dir pour les développer en ensembles d'objets FileInfo.

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()
  }
}
16
Tim Lewis

Je ne pense pas qu'il y ait une manière indigène.

Il existe cet utilitaire DOS: Shortcut.exe .

Vous devez toujours copier l'utilitaire sur le système distant, puis éventuellement l'appeler à l'aide de WMI pour apporter les modifications souhaitées.

Je pense que le moyen le plus simple sera de remplacer et/ou de créer un nouveau fichier.

Avez-vous accès à ces systèmes via un partage distant?

3
Marco Shaw

Un petit ajout à la réponse de @ JasonMArcher ..

Pour voir les propriétés disponibles, vous pouvez simplement exécuter $shortcut après $shortcut = $Shell.CreateShortcut($destination) dans unPS. Cela affichera toutes les propriétés et leurs valeurs actuelles.

0
schtiefel