🎞️
【PowerShell】パス文字列かファイルかに関係なくパイプ経由でも受け取りたいときの書き方
環境:
> $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