valuefrompipeline 是 powershell 参数属性,需配合 [parameter] 使用以接收管道对象;要求参数有明确类型声明且标记该属性,输入在 process 块中逐个处理。
valuefrompipeline 是 powershell 中用于让函数参数自动从管道接收输入的核心机制。它不是命令,而是一个参数属性(parameter attribute),需要配合 [parameter] 使用,告诉 powershell:“这个参数愿意接受来自管道的对象”。
必须满足的两个前提条件
要让 ValueFromPipeline 正常工作,需同时满足:
- 参数必须有明确的类型声明(如
[string]、[int]或[object]),不能是未声明类型的$args形式 - 该参数必须标记为
[Parameter(ValueFromPipeline)],且不能和ValueFromPipelineByPropertyName冲突(除非有意混合使用)
基础用法:按值接收整个对象
当管道传递的是单个对象(比如字符串、数字或自定义对象),PowerShell 会把整个对象传给带 ValueFromPipeline 的参数:
function Get-StringLength {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string]$InputString
)
process {
$InputString.Length
}
}
调用方式:
"hello", "world" | Get-StringLength # 输出:5 和 5
注意:process 块是关键——管道输入是逐个进入的,必须在 process 中处理,不能只写在 begin 或 end 里。
完整流程:Reddit 痛点扫描 → 聚类 → 构建 pip 可安装的 CLI 工具 → 推送到 GitHub。使用此模式已交付 5 款工具,经验证 343 条痛点。
接收复杂对象:支持任意 .NET 类型
只要参数类型能隐式转换或直接匹配,就能接收对象。例如接收 FileInfo 对象:
function Show-FileSize {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[System.IO.FileInfo]$File
)
process {
"$($File.Name): $($File.Length) bytes"
}
}
使用:
Get-ChildItem *.txt | Show-FileSize
这里 Get-ChildItem 输出的每个 FileInfo 对象,都会被完整传入 $File 参数。
常见误区与注意事项
- 如果函数有多个参数都标了
ValueFromPipeline,PowerShell 只会把管道对象传给第一个匹配的参数(按参数声明顺序) - 不支持“一次管道传多个参数值”,即不能靠一个管道同时填充
$Name和$Age—— 那得用ValueFromPipelineByPropertyName - 若参数类型不兼容(如管道传入
[pscustomobject],但参数声明为[int]),会报错或静默失败,建议加类型校验或用[object]+ 手动判断 - 别忘了加上
process块,否则管道输入会被忽略










