如何检测PowerShell管道输入对象是否为字符串、整数类标量对象?
解决SelectFZF-Object处理标量值的问题
原函数仅能处理包含指定属性的复杂对象,无法支持字符串、整数这类标量值的交互式选择——因为标量不存在默认的title属性,导致fzf无法获取显示内容,后续匹配也会失败。
修改思路
核心是先判断输入对象的类型:
- 如果是标量(字符串、整数等),直接用对象自身作为fzf的显示内容,选中后直接返回匹配的标量
- 如果是带属性的复杂对象,保留原有逻辑,基于指定的
DisplayProperty进行显示和匹配
修改后的完整函数
Function SelectFZF-Object{ param( [argumentcompletions('Name','BaseName','Extension','Parent','FullName','Title','Url')] [parameter(ValueFromPipelineByPropertyName)] [string]$DisplayProperty = "title", [String]$Limit = "50", [String]$mode = "-m", [Parameter(ValueFromPipeline)] $InputObject ) begin{$collect = [System.Collections.Generic.List[object]]::new()} process{$collect.Add($InputObject)} end{ # 判断是否为标量类型(字符串或值类型),或对象不存在指定属性 $isScalar = $false if ($collect.Count -gt 0) { $firstObj = $collect[0] $isScalar = $firstObj -is [string] -or $firstObj -is [ValueType] -or (-not $firstObj.PSObject.Properties[$DisplayProperty]) } if ($isScalar) { # 标量处理逻辑:直接用对象本身显示和匹配 $collect | ForEach-Object { $_ } | fzf -e $mode | ForEach-Object { $selected = $_ $collect | Where-Object { $_ -eq $selected } } } else { # 原有复杂对象处理逻辑 $collect | ForEach-Object { $_."$DisplayProperty" } | fzf -e $mode | ForEach-Object { $selectedProp = $_ $collect | Where-Object { $_."$DisplayProperty" -eq $selectedProp } } } } }
测试验证
- 标量测试:执行
"foo", "bar", "baz" | SelectFZF-Object,选中bar后会正确返回该字符串 - 复杂对象测试:执行
Get-ChildItem | SelectFZF-Object -DisplayProperty Name,依然可以通过文件名选择文件对象
内容的提问来源于stack exchange,提问作者GaryAtlan82
相关产品推荐
相关产品推荐

