PowerShellで「デスクトップ」とか「マイドキュメント」のパスを調べる

Windowsでプログラムを書いてて、「デスクトップのパスが取得したい!」とか思うときありますよね。
Google先生に聞いてみると「%USERPROFILE%\デスクトップで取得可能だよ!」とか言われてしまい、駄目だこいつ・・・はやくなんとかしないと・・・状態になります。ご存知の通り、エクスプローラで"場所"を"移動"している場合Google先生案は役に立たないのです。

そういう時、新米Windowsエンジニアの僕にはすでに次の発想に至る用意があります。つまり、レジストリを探せ」です。
Windowsの設定、情報の永続化の多くは「レジストリ」にレジスターすることにより実現されています。例えば、ユーザごとの設定であればHKLU、端末ごとの設定であればHKCUといった具合です(例外もあるよ)。
今回の対象は、"HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"にあるみたいです。

以下のスクリプトで取得できます。

# デスクトップとかマイドキュメントのパスが格納されているレジストリ
$shell_folders_path="HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

# 値はプロパティとして保持されているらしいので、Get-ItemPropertyで取り出す 
$items = Get-ItemProperty $shell_folders_path 

# 試しにいくつか取得してみる。
$props_to_show = @( "DeskTop" ; "Personal" ; "My Pictures" ; "History" ; "Cookies" )
$props_to_show | Foreach-Object {
    Write-Output ( $_ + "はこれ→" + $items.$_ )
}

# 全部出力する
$items

上記の通りです。実行してみると以下のように出力されます(自分はデータは大体Eドライブに入れてます)。

DeskTopはこれ→E:\<ユーザ名>\Desktop
Personalはこれ→E:\<ユーザ名>\Documents
My Picturesはこれ→E:\<ユーザ名>\Pictures
Historyはこれ→C:\Users\<ユーザ名>\AppData\Local\Microsoft\Windows\History
Cookiesはこれ→C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Windows\Cookies

…($items全出力は割愛)

これ書いてて気づいたんですが、マイドキュメントは「Personal」っていうプロパティみたいです。