適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

ファイルのフルパスを拡張子を除いて取得する【PowerShell】

PowerShellで作業していると、ファイルの保存形式を変更することがよくあります。多くの場合、フォルダの中から対象となるファイルをGet-ChildItemコマンドレットで取得し、それをパイプラインで処理しています。ファイルの保存形式が変更されるということは、Windowsだとファイル名に含まれる拡張子を変更する必要があります。保存形式を変更する方法にもよりますが、私の経験上、保存形式を変更したいファイル名と変更後のファイル名の両方を指定することが多く、そういう場合は、同じファイル名で、拡張子だけ変更したい場面が多い気がします。

そうするとGet-ChildItemコマンドレットで拡張子を除いたフルパスを取得して、任意の拡張子を保存先に指定したいわけです。そのときに私がよく使うパイプ処理について紹介したいと思います。

ファイルのディレクトリ名を取得する

Get-ChildItemで取得できるのは、 System.IO.DirectoryInfoもしくは、System.IO.FileInfoオブジェクトです。今回のケースでは、ファイルを対象とするので、System.IO.FileInfoオブジェクトで話を進めていきます。

ファイルのディレクトリ情報を取得するためには、System.IO.FileInfoオブジェクトのDirectoryNameプロパティを使います。DirectoryNameプロパティはディレクトリ名を文字列で取得することができます。同じような名前のプロパティであるDirectoryプロパティはSystem.IO.DirectoryInfoオブジェクトを取得するためのプロパティのため、いつも、DirectoryNameを使っています。

 
##ディレクトリ名を取得する
Get-ChildItem|Where-Object{!$_.PsIsContainer}|foreach{$_.DirectoryName}

こうすることでGet-ChildItemコマンドレットで取得したファイルのディレクトリ名を取得することができました。一応下記の方法でもできますが、次の処理でパイプラインで渡すことを考えるとこの場合は不向きなので紹介するにとどめます。

 
##これでも可能だが次にパイプラインに渡すことを考えると不向き
(Get-ChildItem|Where-Object{!$_.PsIsContainer}).DirectoryName

ファイルから拡張子を除いた名前を取得する

System.IO.FileInfoオブジェクトから拡張子を除いたファイル名を取得するときは、BaseNameプロパティを使います。

 
Get-ChildItem|Where-Object{!$_.PsIsContainer}|foreach{$_.BaseName}

こうすることで拡張子を除いたファイル名を取得することができます。

【結論】ディレクトリと拡張子を除いたファイル名を組み合わせる

あとはここまで紹介した二つのプロパティを組み合わせるだけです。組み合わせる際は間違いないようにJoin-Pathコマンドレットを使ってあげます。そうすることでパスの区切り文字をよしなに処理してくれます。

 
Get-ChildItem|Where-Object{!$_.PsIsContainer}|foreach{Join-Path $_.DirectoryName $_.BaseName}

特定のフォルダを処理する場合はGet-ChildItemコマンドレットのPathを指定してあげてください。

終わりに

ファイルのフルパスを拡張子を除いて取得する方法について解説しました。

ファイル処理もPowerShellなら簡単に行うことができます。一括で拡張子を変更したりすることもこれを応用すれば簡単に行うことができます。たまに拡張子を変更して、ファイルの形式を変更した!!と言う人がいるとかいないとか・・・。少なくともこの記事を読もうと思った人にはいないですが・・・。

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