代码之家  ›  专栏  ›  技术社区  ›  Vopel

添加隐藏的属性,除非该属性具有值

  •  0
  • Vopel  · 技术社区  · 2 年前

    我正在添加一个与软件包相关的类。为了这个问题的目的,这里有一个简单的版本:

    class Package {
        $Name; $Latest; $Prerelease
        [string]ToString(){ return $this.Name }
    }
    $test = [Package]::new()
    $test.Name = 'Example'
    $test.Latest = '0.1'
    

    当我执行命令时 $test $test | Format-Table ,我希望$Prerelease属性被隐藏 除非 它被赋予了一个价值。

    而且,虽然下一部分不是必需的,但我也希望它在类似 Format-Table -Force 使用。

    我发誓我在PowerShell中看到过其他对象的类似行为,但我记不起它们是什么。如果这对于使用纯PowerShell创建的对象来说是不可行的,我不介意通过 Add-Type


    P.S。 关于建议替代方案,请记住,我希望引用对象来输出$Name属性,就像我在上面发布的类中所做的那样,例如。 "$test"

    1 回复  |  直到 2 年前
        1
  •  2
  •   Mathias R. Jessen    2 年前

    正如评论中所提到的,只需使用 [PSCustomObject] 表达式。

    然后,您可以为 ToString() 方法:

    function New-VopelPackage {
      param(
        [Parameter(Mandatory = $true)]
        [string]$Name,
    
        [Parameter(Mandatory = $true)]
        [string]$Latest,
    
        [Parameter(Mandatory = $false)]
        [switch]$Prerelease
      )
    
      # Collect the mandatory properties
      $newPackageProperties = [ordered]@{
        Name = $Name
        Latest = $Latest
      }
    
      # Conditionally add the optional one
      if ($PSBoundParameters.ContainsKey('Prerelease')) {
        $newPackageProperties['Prerelease'] = $Prerelease.IsPresent
      }
    
      # Create the object
      $package = [PSCustomObject]$newPackageProperties 
    
      # ... and override ToString()
      $toStringMemberParams = @{
        Name       = 'ToString'
        MemberType = 'ScriptMethod'
        Value      = { return $this.Name }
        Force      = $true
        PassThru   = $true
      }
    
      return $package |Add-Member @toStringMemberParams
    }
    

    现在,您可以使用描述的行为创建包对象:

    PS ~> $package = New-VopelPackage Example 0.1
    PS ~> $package
    
    Name    Latest
    ----    ------
    Example 0.1
    
    PS ~> "$package"
    Example
    PS ~> $prereleasePackage = New-VopelPackage Example 0.1 -Prerelease
    PS ~> $prereleasePackage
    
    Name    Latest Prerelease
    ----    ------ ----------
    Example 0.1          True
    
    PS ~> "$prereleasePackage"
    Example