【PowerShell】パスの操作方法まとめ
この記事では、PowerShellでのパスの操作方法をまとめています。
パスにはファイルやフォルダを区切る\
があるため、パスの操作は単なる文字列の結合ではなく、少し面倒な操作です。
プログラミング言語によっては、文字列で操作するため\
が二重でついてしまい誤ったパスにアクセスしようとするということがわりとあります。PowerShellには、パスを操作するコマンドレットが用意されているため簡単に間違いなく操作できます。
パスの存在確認
ファイルの存在を確認する
ファイルの存在確認には、Test-Path
を使います。存在すればTrue、存在しなければFalseが返ります。
Test-Path -Path 'C:\Windows\System32\user32.dll'
フォルダの存在を確認する
フォルダの存在確認も、ファイルと同様にTest-Path
を使います。存在すればTrue、存在しなければFalseが返ります。
Test-Path -Path 'C:\Windows'
パスの結合
パスを結合する場合は、Join-Path
を使います。
以下は、C:\temp
とaccess.log
を結合しています。この時、C:\temp
であってもC:\temp\
であっても正しくC:\temp\access.log
のパスが生成されます。
Join-Path -Path 'C:\temp' -ChildPath 'access.log'
複数のパスを一度に結合する場合は、Join-Path
をパイプでつなぎます。
Join-Path -Path 'C:\temp' -ChildPath '20201024' | Join-Path -ChildPath 'access.log'
パスの分解
パスを分解する場合は、Split-Path
を使います。
パスの親要素を取得する
フォルダパスだけ取得したいケースでは、パスの最後の要素を除いて取得したいです。この場合、-Parent
オプションを使用します。
Split-Path -Path 'C:\temp\access.log' -Parent
パスの子要素を取得する
ファイル名だけ取得したいケースなどでは、パスの最後の要素を取得したいです。この場合、-Leaf
オプションを使用します。
Split-Path -Path 'C:\temp\access.log' -Leaf
ファイル名(拡張子なし)を取得する
ファイル名の拡張子の前の部分だけ取得したい場合があります。この場合は、System.IO.FileInfo
のBaseName
プロパティを使います。(System.IO.FileInfo
はGet-Item
等で取得したオブジェクトになります。)
例えば、user32.dll
のファイル名(拡張子なし)を取得する場合は、以下のようになります。
(Get-Item 'C:\Windows\System32\user32.dll').BaseName
拡張子を取得する
ファイル名の拡張子を取得する場合はSystem.IO.FileInfo
のExtension
プロパティを使います。
例えば、user32.dll
の拡張子を取得する場合は、以下のようになります。
(Get-Item 'C:\Windows\System32\user32.dll').Extension
カレントディレクトリの操作
カレントディレクトリを取得する
カレントディレクトリを取得する場合は、Get-Location
を使います。
Get-Location
カレントディレクトリを移動する
カレントディレクトリを移動する場合は、Set-Location
を使います。
Set-Location -Path 'C:\Windows'
Set-Location
はデフォルトでは何も出力しないので、移動したディレクトリを確認したい場合は、-PathThru
オプションをつけます。
Set-Location -Path 'C:\Windows' -PassThru
親ディレクトリに移動する
DOSコマンドや他言語と同様に、PowerShellでもカレントディレクトリは.
、親ディレクトリは..
で表します。これを使って親ディレクトリに移動するには、以下のようにします。
Set-Location -Path ..
ホームディレクトリに移動する
PowerSellを起動すると通常カレントディレクトリはユーザーフォルダ(C:\Users<UserName>)になります。カレントディレクトリを移動していると、一度にホームディレクトリに移動したい場合があります。この場合は、~
を使って以下のようにします。
Set-Location -Path ~
pushとpop
カレントディレクトリを移動していると、1つ前のディレクトリに戻りたい場合があります。その場合、1つ前のディレクトリパスを覚えておく必要がありますが、わりと面倒です。特に複数のディレクトリ階層を移動していると2つ前、3つ前なんて覚えてられません。
DOSコマンドの場合は、カレントディレクトリの移動の際、直前のパスを覚えていてくれる便利なコマンドpush
とpop
がありました。PowerShellにも同様のコマンドがあります。Push-Location
とPop-Location
です。
これを使うと以下のようになります。
# カレントディレクトリが‘C:¥Users\<UserName>`だとする
Push-Location -Path 'C:\Windows'
# カレントディレクトリは`C:\Windows`。
Pop-Location
# カレントディレクトリは‘C:¥Users\<UserName>`。
特別なフォルダ
「ドキュメント」フォルダなど、Windowsには意味を持った特別なフォルダがあります。これらのパスを取得したい場合、以下のようにします。
#
# 特別なフォルダ
#
# 管理ツールフォルダ(ローミング)
# (C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools)
[Environment]::GetFolderPath('AdminTools')
# アプリデータフォルダ(ローミング)
# (C:\Users\<UserName>\AppData\Roaming)
[Environment]::GetFolderPath('ApplicationData')
# CD書き込みフォルダ
# (C:\Users\<UserName>\AppData\Local\Microsoft\Windows\Burn\Burn)
[Environment]::GetFolderPath('CDBurning')
# ユーザー共通 管理ツールフォルダ
# (C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools)
[Environment]::GetFolderPath('CommonAdminTools')
# ユーザー共通 アプリデータフォルダ
# (C:\ProgramData)
[Environment]::GetFolderPath('CommonApplicationData')
# ユーザー共通 デスクトップフォルダ
# (C:\Users\Public\Desktop)
[Environment]::GetFolderPath('CommonDesktopDirectory')
# ユーザー共通 ドキュメントフォルダ
# (C:\Users\Public\Documents)
[Environment]::GetFolderPath('CommonDocuments')
# ユーザー共通 ミュージックフォルダ
# (C:\Users\Public\Documents)
[Environment]::GetFolderPath('CommonMusic')
# 下位互換のためWindows Vistaまで。現在は使用できない。
# [Environment]::GetFolderPath('CommonOemLinks')
# ユーザー共通 ピクチャフォルダ
# (C:\Users\Public\Pictures)
[Environment]::GetFolderPath('CommonPictures')
# アプリ間共有フォルダ
# (C:\Program Files\Common Files)
[Environment]::GetFolderPath('CommonProgramFiles')
# アプリ間共有フォルダ(x86)
# (C:\Program Files (x86)\Common Files)
[Environment]::GetFolderPath('CommonProgramFilesX86')
# スタートメニューフォルダ(プログラム)
# (C:\ProgramData\Microsoft\Windows\Start Menu\Programs)
[Environment]::GetFolderPath('CommonPrograms')
# スタートメニューフォルダ
# (C:\ProgramData\Microsoft\Windows\Start Menu)
[Environment]::GetFolderPath('CommonStartMenu')
# スタートアップフォルダ
# (C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup)
[Environment]::GetFolderPath('CommonStartup')
# テンプレートフォルダ
# (C:\ProgramData\Microsoft\Windows\Templates)
[Environment]::GetFolderPath('CommonTemplates')
# ユーザー共通 ビデオフォルダ
# (C:\Users\Public\Videos)
[Environment]::GetFolderPath('CommonVideos')
# Cookiesフォルダ
# (C:\Users\<UserName>\AppData\Local\Microsoft\Windows\INetCookies)
[Environment]::GetFolderPath('Cookies')
# デスクトップフォルダ(仮想)
# (C:\Users\<UserName>\Desktop)
[Environment]::GetFolderPath('Desktop')
# デスクトップフォルダ(物理)
# (C:\Users\<UserName>\Desktop)
[Environment]::GetFolderPath('DesktopDirectory')
# お気に入りフォルダ
# (C:\Users\<UserName>\Favorites)
[Environment]::GetFolderPath('Favorites')
# フォントフォルダ
# (C:\WINDOWS\Fonts)
[Environment]::GetFolderPath('Fonts')
# 履歴フォルダ
# (C:\Users\<UserName>\AppData\Local\Microsoft\Windows\History)
[Environment]::GetFolderPath('History')
# インターネットキャッシュフォルダ
# (C:\Users\<UserName>\AppData\Local\Microsoft\Windows\INetCache)
[Environment]::GetFolderPath('InternetCache')
# ローカル アプリ間共有フォルダ
# C:\Users\<UserName>\AppData\Local
[Environment]::GetFolderPath('LocalApplicationData')
# ローカライズリソースフォルダ
#
[Environment]::GetFolderPath('LocalizedResources')
# マイコンピュータ
#
[Environment]::GetFolderPath('MyComputer')
# マイドキュメント
# (C:\Users\<UserName>\Documents)
[Environment]::GetFolderPath('MyDocuments')
# マイミュージック
# C:\Users\<UserName>\Music
[Environment]::GetFolderPath('MyMusic')
# マイピクチャ
# C:\Users\<UserName>\Pictures
[Environment]::GetFolderPath('MyPictures')
# マイビデオ
# C:\Users\<UserName>\Videos
[Environment]::GetFolderPath('MyVideos')
# ネットワークショートカット
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Network Shortcuts
[Environment]::GetFolderPath('NetworkShortcuts')
# パーソナル(マイドキュメント)
# C:\Users\<UserName>\Documents
[Environment]::GetFolderPath('Personal')
# プリンターショートカット
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
[Environment]::GetFolderPath('PrinterShortcuts')
# プログラムファイル
# C:\Program Files
[Environment]::GetFolderPath('ProgramFiles')
# プログラムファイル(x86)
# C:\Program Files (x86)
[Environment]::GetFolderPath('ProgramFilesX86')
# ユーザー スタートメニュー(プログラム)
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
[Environment]::GetFolderPath('Programs')
# 最近使ったファイル
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Recent
[Environment]::GetFolderPath('Recent')
# システムリソース
# C:\WINDOWS\resources
[Environment]::GetFolderPath('Resources')
# 送るメニュー
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\SendTo
[Environment]::GetFolderPath('SendTo')
# スタートメニュー
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu
[Environment]::GetFolderPath('StartMenu')
# スタートアップ
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
[Environment]::GetFolderPath('Startup')
# system32フォルダ
# C:\WINDOWS\system32
[Environment]::GetFolderPath('System')
# syswow64フォルダ
# C:\WINDOWS\SysWOW64
[Environment]::GetFolderPath('SystemX86')
# テンプレートフォルダ
# C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Templates
[Environment]::GetFolderPath('Templates')
# ユーザープロファイル
# C:\Users\<UserName>
[Environment]::GetFolderPath('UserProfile')
# Windowsフォルダ
# C:\WINDOWS
[Environment]::GetFolderPath('Windows')
参考サイト
- Environment.SpecialFolder 列挙型
- 特別なフォルダについて記載されています。
まとめ
パスの操作方法をまとめました。パスを文字列で操作すると間違いのもとです。Join-Path
とSplit-Path
を使うことで間違いなく操作できます。
パスの操作はとてもよく使うので、よく理解しておきたいですね。
最後まで読んでいただきありがとうございます。
また読んでくださいませ。
そんじゃーね。