PowerShellで、ショートカット情報を得るフィルタを作ってみる
先日 フォルダの整理をしていて、ショートカットを含んだフォルダを移動したので、ショートカットの手直しが必要だな。と思いつきました。
で、手直し対象となるショートカットを どうやって検出するか暫く考えました。
- DOSコマンドかCygwinのコマンドから'*.lnk'を抜き出して、リンク先のプロパティ値を取り出す。
→暫く ぐぐって見たんですが、どうもやり方が判んない。 - WSHでスクリプトを書く。
→WshShell.CreateShortcutメソッドでショートカット情報が得られるのですが、ショートカットファイルの列挙が面倒。 - 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
上の処理は、以下のように流しています。
- 「
dir -r -include "*.lnk"
」で、ショートカットファイルを列挙。パイプラインで次のフィルタ関数へ。 - 「
Get-Shortcut
」(今回新たに作った)で、ショートカット情報を得る。パイプラインで次のフィルタ関数へ。 - 「
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はオブジェクトとして扱うので、更に進化していると言えます)