PowerShellでファイル名だけ、拡張子だけ、拡張子を除いたフルパスなど取得するコード色々

※この記事の初版は2021年1月でした。

こんにちは、堀井です。

zip圧縮を行うバッチを作りたいときや、ファイル移動を行いたいときに使えると思います。

前提としてファイルパスを記載した変数が用意されているものとします。

[string]$filePathName = "C:\Users\USERNAME\Desktop\hoge.txt"

拡張子を除くフルパス(C:\Users\USERNAME\Desktop\hoge)を取り出す

# パターン1
$filePathName.Substring(0, $filePathName.LastIndexOf('.'))

最後に . が出てくる箇所を見つけて、それより前の文字列を切り取ります。

# パターン2
Join-Path([System.IO.FileInfo]$filePathName).DirectoryName ([System.IO.FileInfo]$filePathName).BaseName

親フォルダのパスとファイル名をくっつけています。

# パターン3
$filePathName -replace '\.[^.\\/]+

フルパスから . 以下を空白で置換しています。


拡張子込みのファイル名(hoge.txt)を取り出す

# パターン1
(Get-ChildItem -Path $filePathName).Name

文字列ではなくパスとして解釈した上で、そのファイル名を取得します。

# パターン2
[System.IO.Path]::GetFileName("$filePathName")

ストレートに、ファイル名を取得するメソッドを利用しています。

# パターン3
Split-Path $filePathName -Leaf

Split-Pathという超絶便利なコマンドレットにより切り出しています。

効果は以下の通り。

Split-Path $path [command]
  -Qualifier : ドライブ名
  -noQualifier : ドライブ名以外
  -Parent : 親フォルダ
  -Leaf : 末端の要素

ファイル名のみ(hoge)を取り出す

# パターン1
[System.IO.Path]::GetFileNameWithoutExtension("$filePathName")

ストレートに、拡張子を除いたファイル名を取得するメソッドを利用しています。

# パターン2
(Split-Path -Path $filePathName -Leaf) -replace '(.+)(\.[^.]+$)','$1'

拡張子込みのファイル名を取得し、それに対し正規表現を用いて . の手前のみ取得しています。


拡張子のみ(.txt)を取り出す

# パターン1
[System.IO.Path]::GetExtension("$filePathName")

ストレートに、拡張子のみを取得するメソッドを利用しています。

# パターン2
(Split-Path -Path $filePathName -Leaf) -replace '(.+)(\.[^.]+$)','$2'

拡張子込みのファイル名を取得し、それに対し正規表現を用いて . 以降を取得しています。


バッチって普段全然触らないから中々面白いですね、普段使いとしてもうちょっと楽しめそうです。それではまた次回。

コメントする