将字符串转换为 int 并仅为 TFS 中的内部版本号增加最后一位数字

bob*_*ith 1 versioning powershell increment version-numbering

我正在寻找一种将字符串 1.2.0 转换为 int 的方法,以便我可以增加最后一位数字。最终结果应该是 1.2.1

$values = '1.2.0'

$after = $values.split('.');

$result = [int]$after;

# TODO increment the last decimal value, result should be 1.2.3

$result
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

令人惊讶的是,该System.Version类型不支持增加版本号组件的方法(PowerShell Core-onlySystem.Management.Automation.SemanticVersion类型也不支持)。

这是一个 PSv5+ 解决方案:

$versionString = '1.2.0'

$version = [version] $versionString

$versionStringIncremented = [string] [version]::new(
  $version.Major,
  $version.Minor,
  $version.Build + 1
)

# $versionStringIncremented now contains '1.2.1'
Run Code Online (Sandbox Code Playgroud)

如果您想将其包装在一个允许递增任何组件的函数中,同时将所有较低的组件设置为 ,0或者在 的情况下设置.Revision为未定义(报告为-1):

function Increment-Version {
  param(
    [Parameter(Mandatory)]
    [version] $Version
    ,
    [ValidateSet('Major', 'Minor', 'Build', 'Revision')]
    [string] $Component = 'Revision'
  )

  $useRevision = $Version.Revision -ne -1 -or $Component -eq 'Revision'

  $Major, $Minor, $Build, $Revision =
    $Version.Major, $Version.Minor, $Version.Build, $Version.Revision

  switch ($Component) {
    'Major' { $Minor = $Build = 0 }
    'Minor' { $Build = 0 }
  }

  Set-Variable $Component (1 + (Get-Variable -ValueOnly $Component))

  if ($useRevision) {
    [version]::new(
      $Major,
      $Minor,
      $Build,
      $Revision
    )
  } else {
    [version]::new(
      $Major,
      $Minor,
      $Build
    )
  }

}
Run Code Online (Sandbox Code Playgroud)

然后您的命令将简化为:

# -> '1.2.1'
$versionStringIncremented = [string] (Increment-Version 1.2.0 -Component Build)

# -> '1.3.0'
$versionStringIncremented = [string] (Increment-Version 1.2.7 -Component Minor)
Run Code Online (Sandbox Code Playgroud)