適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

PowerShellでシステムパス(Desktop)などの場所を知りたいときに見る記事

デスクトップやマイドキュメントのパス

スクリプトを書いていると、環境に左右されないパスを使いたいことがよくあります。

ユーザーフレンドリーを目指して、マイドキュメントやデスクトップにファイルを吐き出したいときなど。

そんなときにに役立つ、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でシステムパスを取得する方法でした。

ユーザーフレンドリーなアプリを作る際には重宝すること請け合いです。

ここまでお読みいただき、ありがとうございました。