Question

J’ai trouvé un moyen désagréable de faire VBS, mais je cherche une procédure PoSh native pour éditer les propriétés d’un fichier .LNK. L’objectif est d’atteindre les 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.

Était-ce utile?

La solution

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

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

Autres conseils

Ci-dessous sont 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 la gestion des caractères génériques tels que * 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()
  }
}

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

Il existe cet utilitaire DOS: Shortcut.exe .

Vous devez toujours copier le fichier util 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 consiste à écraser et / ou créer un nouveau fichier.

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

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 un PS . Ceci imprimera toutes les propriétés et leurs valeurs actuelles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top