使用自定义格式将对象转换为字符串

时间:2019-05-03 23:52:27

标签: powershell

假设我有这个:

[System.Version]::new(1, 2, 3, 4)

如何将其转换为"3.4"?我对尽可能地传递代码感兴趣,以避免必须创建一个中间变量。

7 个答案:

答案 0 :(得分:3)

这是 ugly ,但是它在行内工作得很好。它使用.Split()选项将结果放入特定数量的项目中,所有剩余的项目都添加到最后一个项目中。

([version]'1.2.3.4').ToString().Split('.', 3)[-1]

output = 3.4

答案 1 :(得分:2)

另一个丑陋但内联的解决方案,使用ForEach-Object来获取管道引用。

[System.Version]::new(1, 2, 3, 4) | ForEach-Object { "$($_.Build).$($_.Revision)" }

答案 2 :(得分:2)

您还可以考虑为此创建一个通过管道输入起作用的函数:

Function ConvertTo-BuildRevision {
    Param(
        [Parameter(ValueFromPipeline)]
        [system.version]
        $Version
    )
    Process {
        Return "$($Version.Build).$($Version.Revision)"
    }
}

[System.Version]::new(1, 2, 3, 4) | ConvertTo-BuildRevision

这显然要多得多的代码行,但是如果您在代码中多次执行这种转换,看起来会更加干净。

答案 3 :(得分:1)

这是另一种选择,它使用Select-Object和计算所得的属性作为名为BR的属性来获取所需的结果,然后将其返回:

([System.Version]::new(1, 2, 3, 4) | Select @{N ='BR'; E = { "$($_.Build).$($_.Revision)" }}).BR

答案 4 :(得分:0)

如果将其设置为变量,则可以执行以下操作:

$version = [System.Version]::new(1, 2, 3, 4)
"$($version.Build).$($version.Revision)"

答案 5 :(得分:0)

具有regex的基于-replace operator的解决方案:

PS> [System.Version]::new(1, 2, 3, 4) -replace '^(.+?\.){2}'
3.4

答案 6 :(得分:0)

使用包装器并添加chmod +x install

ScriptProperty

Function New-Version {
    $Version = New-Object System.Version $Args
    $Version | Add-Member ScriptProperty BuildRevision {"$($This.Build).$($This.Revision)"} 
    Write-Output $Version
}