You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:56:17