デスクトップやマイドキュメントのパス
スクリプトを書いていると、環境に左右されないパスを使いたいことがよくあります。
ユーザーフレンドリーを目指して、マイドキュメントやデスクトップにファイルを吐き出したいときなど。
そんなときにに役立つ、PowerShellでデスクトップやマイドキュメントを取得する方法を紹介したいと思います。
環境
PS C:\Users\USER> $PSVersionTable NameValue --------- PSVersion5.1.18362.752 PSEditionDesktop PSCompatibleVersions{1.0, 2.0, 3.0, 4.0...} BuildVersion10.0.18362.752 CLRVersion4.0.30319.42000 WSManStackVersion3.0 PSRemotingProtocolVersion2.3 SerializationVersion1.1.0.1
主な方法は2つ
デスクトップのようなシステムパスの場所を知るための方法はPowerShellでは主に2つあります。
1つ目は、.NETのSystem.Enviroment::GetFolderPathを使う方法。
2つ目は、WSHのspecialfolderを使う方法。
では、実際にどんなパスが取得できるのか見てみます。
[System.Enviroment]::GetFolderPath
.NETのEnviromentを使うことでシステムフォルダを取得することができます。
取得できるフォルダ一覧
PS C:\> [System.Enum]::GetValues([System.Environment+SpecialFolder])
Desktop
Programs
MyDocuments
MyDocuments
Favorites
Startup
Recent
SendTo
StartMenu
MyMusic
MyVideos
DesktopDirectory
MyComputer
NetworkShortcuts
Fonts
Templates
CommonStartMenu
CommonPrograms
CommonStartup
CommonDesktopDirectory
ApplicationData
PrinterShortcuts
LocalApplicationData
InternetCache
Cookies
History
CommonApplicationData
Windows
System
ProgramFiles
MyPictures
UserProfile
SystemX86
ProgramFilesX86
CommonProgramFiles
CommonProgramFilesX86
CommonTemplates
CommonDocuments
CommonAdminTools
AdminTools
CommonMusic
CommonPictures
CommonVideos
Resources
LocalizedResources
CommonOemLinks
CDBurning
各フォルダの詳細は公式ドキュメントに記載があります。
Desktopのパスを取得する場合
PS C:\> [System.Environment]::GetFolderPath("Desktop") C:\Users\User\Desktop
値とフォルダの一覧を作成
PS C:\> $ary=@();[System.Enum]::GetValues([System.Environment+SpecialFolder])|%{$ary+=(New-Object psobject -Property @{value=$_; path=([System.Environment]::GetFolderPath($_))})};$ary|format-list value : Desktop path: C:\Users\USER\Desktop value : Programs path: C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu\Programs value : MyDocuments path: C:\Users\USER\Documents 以下省略
WSHのspecialfolder
WSHの機能を使うことでも同じようなことができます。
こちらが参考になります。
下準備
PS C:\> $shell=New-Object -ComObject Wscript.shell
取得できるフォルダ一覧
PS C:\> $shell=New-Object -ComObject Wscript.shell PS C:\> $shell.SpecialFolders C:\Users\Public\Desktop C:\ProgramData\Microsoft\Windows\Start Menu C:\ProgramData\Microsoft\Windows\Start Menu\Programs C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp C:\Users\USER\Desktop C:\Users\USER\AppData\Roaming C:\Users\USER\AppData\Roaming\Microsoft\Windows\Printer Shortcuts C:\Users\USER\AppData\Roaming\Microsoft\Windows\Templates C:\Windows\Fonts C:\Users\USER\AppData\Roaming\Microsoft\Windows\Network Shortcuts C:\Users\USER\Desktop C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu C:\Users\USER\AppData\Roaming\Microsoft\Windows\SendTo C:\Users\USER\AppData\Roaming\Microsoft\Windows\Recent C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup C:\Users\USER\Favorites C:\Users\USER\Documents C:\Users\USER\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Desktopのパスを取得する場合
PS C:\> $shell.SpecialFolders("Desktop") C:\Users\USER\Desktop
違い
両社とも手軽に使えますが、取得できるパスが微妙に違います。
取得したいパスによっては、両者を使い分ける必要があります。
比較
PS C:> $environment=([System.Enum]::GetValues([System.Environment+SpecialFolder])|%{[System.Environment]::GetFolderPath($_)}) PS C:> $wscript= $shell.SpecialFolders PS C:\Users\USER> Compare-Object -ReferenceObject $environment -DifferenceObject $wscript InputObject: C:\Program Files SideIndicator : <= 以下省略
私の環境だとSideIndicatorが<=しかありませんでした。
つまり、.NETの方法が最善のようです。
終わりに
以上、PowerShellでシステムパスを取得する方法でした。
ユーザーフレンドリーなアプリを作る際には重宝すること請け合いです。
ここまでお読みいただき、ありがとうございました。