適材適所

PowerShellやVBAなどプログラミング系の話多めで

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を使うことでシステムフォルダを取得することができます。

取得できるフォルダ一覧

 
[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のパスを取得する場合

 
[System.Environment]::GetFolderPath("Desktop")

C:\Users\User\Desktop

値とフォルダの一覧を作成

戻り値が実際にどのフォルダを指すかは、

下記のコマンドで確認することができます。

 
$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の機能を使うことでも同じようなことができます。

こちらが参考になります。

下準備

 
$shell=New-Object -ComObject Wscript.shell

取得できるフォルダの一覧

 
$shell=New-Object -ComObject Wscript.shell
$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

WSHでDesktopのパスを取得する場合

 
$shell.SpecialFolders("Desktop")
C:\Users\USER\Desktop

GetFolderPathとSpecialFoldersの違い

両者とも手軽に使えますが、

取得できるパスが微妙に違います。

取得したいパスによっては、

両者を使い分ける必要があります。

比較

Compare-Objectを使って、

両者の違いを確認してみましょう。

 
$environment=([System.Enum]::GetValues([System.Environment+SpecialFolder])|%{[System.Environment]::GetFolderPath($_)})
$shell=New-Object -ComObject Wscript.shell
$wscript= $shell.SpecialFolders
Compare-Object -ReferenceObject $environment -DifferenceObject $wscript

InputObject: C:\Program Files
SideIndicator : <=

以下省略

私の環境だとSideIndicatorが<=しかありませんでした。

つまり、.NETのGetFolderPathの方が取得できるパスが多いことを示しています。

通常はGetFolderPathを使えばいいかと思います。

終わりに

PowerShellでシステムパスを取得する方法を紹介しました。

これらをうまく使えば、環境に左右されないスクリプトを作ることができます。

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

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

PowerShellの関連記事

www.tekizai.net

www.tekizai.net

www.tekizai.net

www.tekizai.net