it-swarm.com.de

Bearbeiten von Shortcut-Eigenschaften (.lnk) mit Powershell

Ich habe einen unangenehmen VBS-Weg gefunden, dies zu tun, aber ich suche nach einer nativen PoSh-Prozedur, um die Eigenschaften einer .LNK-Datei zu bearbeiten. Das Ziel ist, Remote-Computer zu erreichen, eine vorhandene Verknüpfung mit den meisten korrekten Eigenschaften zu duplizieren und einige davon zu bearbeiten.

Wenn es einfach einfacher wäre, eine neue Verknüpfungsdatei zu schreiben, würde das auch funktionieren.

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

Die VB -Version des Codes konnte hier gefunden werden: http://www.tutorialized.com/view/tutorial/Extract-the-target-file-from-a-shortcut- Datei-.lnk/18349

30
JasonMArcher

Nachfolgend sind die Funktionen aufgeführt, die ich für den Umgang mit .lnk-Dateien verwende. Sie sind modifizierte Versionen der gefundenen Funktionen hier , wie von @Nathan Hartley erwähnt. Get-Shortcut wurde verbessert, um Platzhalterzeichen wie * zu behandeln, indem Zeichenfolgen an dir übergeben werden, um sie in Gruppen von FileInfo-Objekten zu erweitern.

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

Ich glaube nicht, dass es einen einheimischen Weg gibt.

Es gibt dieses DOS-Hilfsprogramm: Shortcut.exe .

Sie müssen das Dienstprogramm weiterhin auf das Remote-System kopieren und es möglicherweise mithilfe von WMI aufrufen, um die gewünschten Änderungen vorzunehmen.

Ich denke, der einfachere Weg ist das Überschreiben und/oder Erstellen einer neuen Datei.

Haben Sie über eine Remote-Freigabe Zugriff auf diese Systeme?

3
Marco Shaw

Eine kurze Ergänzung zur Antwort von @ JasonMArcher ..

Um die verfügbaren Eigenschaften anzuzeigen, können Sie $shortcut nach $shortcut = $Shell.CreateShortcut($destination) in einemPS. Ausführen. Dadurch werden alle Eigenschaften und ihre aktuellen Werte gedruckt.

0
schtiefel