「既知のフォルダ」パスを調べる
Windows 11では、既知のフォルダの実環境のパスを得る複数のAPIが用意されている。1つは、COMのIKnownFolderとIKnownFolderManagerインターフェースを使う方法だ。もう1つは、WinRTのWindows.Storage.KnownFoldersクラスを使うもの、あるいはWin32APIのシェル関数SHGetKnownFolderPathを使う方法などがある。しかし、これらは、どれもC++やC#などでプログラムを書かねばならず、「簡単」に使えるというものでもない。
Windows PowerShell(あるいはPowerShell 7.x)から簡単に既知のフォルダのパスを得る方法として、.NETの「System.Environment」クラスの「GetFolderPath」メソッドがある。具体的には、以下のようになる。
[Environment]::GetFolderPath('Desktop')
PowerShellで「[Environment]::GetFolderPath」を使うことで、「既知のフォルダ」の現在の環境での実パスを求めることができ、カッコで囲めば、他のコマンドの引数に利用できる。既知のフォルダを指定する列挙値は、「[Environment+SpecialFolder]」に定義されていて、「[Enum]::GetNames」で一覧を得られる(撮影の都合でselectコマンドで出力数を制限している)
上記は、デスクトップのパスを得る方法である。パラメーターとして指定可能な既知のフォルダは、実パスを持つもの(仮想フォルダーでないもの)に限定されており、CSIDL名を使う。その一覧は、以下にある。
●Environment.SpecialFolder 列挙型
https://learn.microsoft.com/ja-jp/dotnet/api/system.environment.specialfolder?redirectedfrom=MSDN&view=netframework-4.8.1
ここにある「フィールド」の表の先頭の文字列か、次の列にある数字を指定する。たとえば、デスクトップなら「GetFolderPath(0)」でもよい。実はこの数字がCSIDLで使われていた定数である。カッコで囲んでおけば、戻ってくるパスを他のPowerShellコマンドの引数にできる。
この列挙型自体は、PowerShellからは「[Environment+SpecialFolder]」としてアクセスでき、「[Environment+SpecialFolder]::desktop」とすることでデスクトップフォルダを指定できる。
[Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)
「[Environment+SpecialFolder]」を使う方法は、面倒そうに見えるが、補完機能が使えるため、カッコ中の「::」の後ろで「D」キーを押したあとタブキーで補完候補を出せる。このクラスで開くことができる「既知のフォルダ」の一覧を得たければ
[Enum]::GetNames([Environment+SpecialFolder])
とする。
日本語の場合、既知のフォルダには、ローカライズされた名称がつく。たとえば、「MyPicture」は「ピクチャ」となる。これを得るには、COMオブジェクト「Shell.Application」を作り、その“NameSpace”から実パスを使って日本語名を探す。
$shell = New-Object -ComObject Shell.Application
$shell.NameSpace([Environment]::GetFolderPath('mypicture')) | select title
残念ながらcmd.exeには、既知のフォルダのパスを得るためのコマンドはないが、pwsh.exe(PowerShell)、powershell.exe(Windows PowerShell)をコマンドとして使い、forコマンドで環境変数に入れる。具体的には以下のようになる。
for /f "usebackq delims=" %A in (`pwsh.exe -noprofile -command "[Environment]::GetFolderPath('Desktop')"`) do set MYP=%A
これで環境変数“MYP”にデスクトップフォルダーのパスが入る。
cmd.exeには、既知のパスを扱うコマンドはない。だがPowerShell(pwsh.exe)やWindows PowerShell(powershell.exe)のコマンドラインから直接「[Environment]::GetFolderPath」を実行させることで、実パスを得ることができる。これをFORコマンドの逆クオートで実行させて、環境変数に設定できる
既知のフォルダは、利用頻度が高く、スクリプトなどからもアクセスすることも多い。しかし、スクリプトの可用性や相互運用性を考えると、パスを決め打ちすることはできない。その場合、CSIDL名や番号を使って、パスを得る必要がある。それほど難しいことではないので、1回パターンを覚えれば、使い回しが可能だ。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ











