ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

PowerShellで、ショートカット情報を得るフィルタを作ってみる

先日 フォルダの整理をしていて、ショートカットを含んだフォルダを移動したので、ショートカットの手直しが必要だな。と思いつきました。
で、手直し対象となるショートカットを どうやって検出するか暫く考えました。

  1. DOSコマンドかCygwinのコマンドから'*.lnk'を抜き出して、リンク先のプロパティ値を取り出す。
    →暫く ぐぐって見たんですが、どうもやり方が判んない。
  2. WSHスクリプトを書く。
    →WshShell.CreateShortcutメソッドでショートカット情報が得られるのですが、ショートカットファイルの列挙が面倒。
  3. PowerShellで何とかしてみる。
    →確か抜き出した情報は、一つ一つオブジェクトとして扱うのだから、そこからショートカット情報が得られるかも。

という訳で、PowerShellで何とかならないか調べてみました。

いきなり結論

結論から言うと、以下の通りでした。

  • PowerShell標準のコマンドでは、ショートカット情報が得られないっぽい。
  • ショートカット情報を得るフィルタコマンドを作る事で、dirコマンドで得たファイル情報からショートカット情報を得る処理が出来る。


例えば、以下のような処理が可能です。

PS> dir -r -include "*.lnk" | Get-Shortcut | Select-Object -property FullName,TargetPath

FullName                                                    TargetPath
--------                                                    ----------
F:\Wacky\Test\PowerShell\sub\TortoiseSVN_ja.1.5.99.chm ...  F:\Wacky\資料\chm\TortoiseSVN_ja.1.5.99.chm
F:\Wacky\Test\PowerShell\PowerShell.chm へのショートカッ... F:\Wacky\資料\chm\PowerShell.chm


上の処理は、以下のように流しています。

  1. dir -r -include "*.lnk"」で、ショートカットファイルを列挙。パイプラインで次のフィルタ関数へ。
  2. Get-Shortcut」(今回新たに作った)で、ショートカット情報を得る。パイプラインで次のフィルタ関数へ。
  3. Select-Object -property FullName,TargetPath」で、ショートカットファイルのフルパス(FullName)とショートカット先(TargetPath)を表示。


で、今回新たに作ったフィルタ関数は、以下の通り。

filter Get-Shortcut()
{
    $shell  = new-object -comobject WScript.Shell
    return $shell.CreateShortcut($_)
}

中身は、たったの2行です。(ショートカット情報を得る為に、WshShell.CreateShortcutを使っています)


余談ですが、「Select-Object」を外すと、ショートカット情報全てが見られます。

PS> dir -r -include "*.lnk" | Get-Shortcut


FullName         : F:\Wacky\Test\PowerShell\sub\TortoiseSVN_ja.1.5.99.chm へのショートカット.lnk
Arguments        :
Description      :
Hotkey           :
IconLocation     : ,0
RelativePath     :
TargetPath       : F:\Wacky\資料\chm\TortoiseSVN_ja.1.5.99.chm
WindowStyle      : 1
WorkingDirectory : F:\Wacky\資料\chm

FullName         : F:\Wacky\Test\PowerShell\PowerShell.chm へのショートカット.lnk
Arguments        :
Description      :
Hotkey           :
IconLocation     : ,0
RelativePath     :
TargetPath       : F:\Wacky\資料\chm\PowerShell.chm
WindowStyle      : 1
WorkingDirectory : F:\Wacky\資料\chm

感想

ちょこっといじった程度なんですが、惚れ込む方が多いのも何となく理解できました。
Linuxでコマンドをパズルのように組み合わせて、意図する処理をワンライナーで実現する感覚と同じなんですね。
(PowerShellはオブジェクトとして扱うので、更に進化していると言えます)