web-dev-qa-db-ja.com

Powershellを使用したショートカット(.lnk)プロパティの編集

これを行うための厄介なVBSの方法を見つけましたが、.LNKファイルのプロパティを編集するためのネイティブのPoShプロシージャを探しています。目標は、リモートマシンに到達し、既存のショートカットを正しいプロパティのほとんどで複製し、それらのいくつかを編集することです。

新しいショートカットファイルを作成する方が簡単であれば、それも機能します。

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

VBコードのバージョンはこちら: http://www.tutorialized.com/view/tutorial/Extract-the-target-file-from-a-shortcut- file-.lnk/18349

31
JasonMArcher

以下は、.lnkファイルを処理するために使用する関数です。これらは、@ Nathan Hartleyによって言及されているように、見つかった関数の修正バージョン here です。文字列をdirに渡してFileInfoオブジェクトのセットに展開することにより、Get-Shortcutのようなワイルドカードを処理するように*を改善しました。

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

ネイティブな方法はないと思います。

このDOSユーティリティがあります: Shortcut.exe

それでも、utilをリモートシステムにコピーし、WMIを使用してそれを呼び出して、探している変更を加える必要があります。

新しいファイルを上書きしたり作成したりするのが簡単な方法だと思います。

リモート共有を介してこれらのシステムにアクセスできますか?

3
Marco Shaw

@JasonMArcherの回答への短い追加。

利用可能なプロパティを表示するには、_[〜#〜] ps [〜#〜]$shortcut = $Shell.CreateShortcut($destination)の後に$shortcutを実行します。これにより、すべてのプロパティとその現在の値が出力されます。

0
schtiefel