Disons que j'ai ceci:
[System.Version]::new(1, 2, 3, 4)
Comment puis-je le convertir en "3.4" ? Je suis intéressé à le canaliser si possible pour éviter d'avoir à créer une variable intermédiaire.
7 Réponses :
Si vous le définissez sur une variable, vous pouvez le faire:
$version = [System.Version]::new(1, 2, 3, 4) "$($version.Build).$($version.Revision)"
c'est moche mais cela fonctionne assez bien en ligne. il utilise l'option .Split () pour placer les résultats dans un nombre spécifique d'éléments avec tous les éléments restants ajoutés au dernier.
([version]'1.2.3.4').ToString().Split('.', 3)[-1]
output = 3.4
Une autre solution moche mais intégrée utilise ForEach-Object pour accéder à la référence redirigée.
[System.Version]::new(1, 2, 3, 4) | ForEach-Object { "$($_.Build).$($_.Revision)" }
Voici une autre option, qui utilise Select-Object et une propriété calculée pour obtenir le résultat souhaité en tant que propriété nommée BR qui est ensuite renvoyée:
([System.Version]::new(1, 2, 3, 4) | Select @{N ='BR'; E = { "$($_.Build).$($_.Revision)" }}).BR
Vous pouvez également envisager de créer une fonction pour cela qui fonctionne via l'entrée Pipeline:
Function ConvertTo-BuildRevision {
Param(
[Parameter(ValueFromPipeline)]
[system.version]
$Version
)
Process {
Return "$($Version.Build).$($Version.Revision)"
}
}
[System.Version]::new(1, 2, 3, 4) | ConvertTo-BuildRevision
Il s'agit évidemment de beaucoup plus de lignes de code, mais si vous effectuiez ce type de conversion plusieurs fois dans votre code serait beaucoup plus propre.
A regex - solution basée sur -replace opérateur :
PS> [System.Version]::new(1, 2, 3, 4) -replace '^(.+?\.){2}'
3.4
Utilisation d'un wrapper et ajout d'une ScriptProperty:
(New-Version 1 2 3 4).BuildRevision 3.4
Function New-Version {
$Version = New-Object System.Version $Args
$Version | Add-Member ScriptProperty BuildRevision {"$($This.Build).$($This.Revision)"}
Write-Output $Version
}