例えば PowerShell を使って以下のようにするのが簡単なようだ
powershell "[Environment]::GetFolderPath('MyDocuments')"
取り得る値は以下の方法で取得できるらしい
powershell "[Enum]::GetNames([Environment+SpecialFolder])"
なぜか Download フォルダがなくて、これは SHGetKnownFolderPath 使って取るらしいんだけど、
レジストリの "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" 見るとあるらしい。
例えば REG コマンドを使うと以下のようにして一覧を取得できる。
REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Download フォルダだけとろうと思うとこんな感じ。
REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v {374DE290-123F-4565-9164-39C4925E467B}
で、この結果を cmd.exe で使いたい場合はちょっと面倒だが以下のようにする必要がある。
FOR /F "usebackq tokens=*" %i in (`powershell "[Environment]::GetFolderPath('MyDocuments')"`) do @set HOGE=%i
echo %HOGE%
ところが、ps の結果は1行まるまる取れば問題ないが、REG は変数名、型、値になってて、"Start Menu" のように空白が混ざってると token 綺麗に切れなくて死ぬ。
MS のコマンドラインツールは本当に酷過ぎるわ。ゴミかよ。
PowerShell 使うとどうにかなるみたいだが。
powershell "(Get-Item -Path 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders').GetValue('Start Menu')"
FOR /F "usebackq tokens=*" %i in (`powershell "(Get-Item -Path 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders').GetValue('Start Menu')"`) do @set HOGE=%i
echo %HOGE%
cmd の使えなさと来たら
ps は ps でデフォルトでは実行権限出てないので使い難い
Cygwin なら以下のような感じで一覧取れば良い。
for i in /proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell\ Folders/*; do printf "%s\n%4s" "${i##*/}" ""; cat "$i";echo;done