🎞️

【PowerShell】パス文字列かファイルかに関係なくパイプ経由でも受け取りたいときの書き方

2021/12/31に公開

環境:

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.2.1
PSEdition                      Core
GitCommitId                    7.2.1
OS                             Microsoft Windows 10.0.19042
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

テンプレート

Get-Item がパス文字列もファイルオブジェクトも受け付けることを利用します。

function Invoke-HOGEHOGE {
    param (
        [parameter(ValueFromPipeline = $true)]$inputObj
    )
    begin {}
    process {
        $fileObj = Get-Item $inputObj
        # ここに処理を書く
    }
    end {}
}

$fileObj には常に System.IO.FileInfo もしくは System.IO.DirectoryInfo が格納され、 .Name.Basename などのプロパティにアクセスできます。

動作例

型を確認してみます。

function Invoke-HOGEHOGE2 {
    param (
        [parameter(ValueFromPipeline = $true)]$inputObj
    )
    begin {}
    process {
        $fileObj = Get-Item $inputObj
        Write-Host $fileObj.GetType()
    }
    end {}
}
> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2021/12/31    12:00                bbb
-a---          2021/12/31    12:00              0 aaa.txt

> Invoke-HOGEHOGE2 .\aaa.txt # パス文字列を渡してみる(ファイル編)
System.IO.FileInfo

> Invoke-HOGEHOGE2 .\bbb\ # パス文字列を渡してみる(フォルダ編)
System.IO.DirectoryInfo

> ls | Invoke-HOGEHOGE2 # パイプで渡してみる
System.IO.DirectoryInfo
System.IO.FileInfo

> ls | % fullname | Invoke-HOGEHOGE2 # パイプ経由でフルパスを文字列として渡してみる
System.IO.DirectoryInfo
System.IO.FileInfo

> ls | % name | Invoke-HOGEHOGE2 # パイプ経由でファイル名を文字列として渡してみる
System.IO.DirectoryInfo
System.IO.FileInfo

Discussion