使用Powershell正则表达式基于架构更新版本

时间:2016-01-12 21:53:44

标签: .net regex xml powershell

所以我正在尝试编写一个Powershell脚本,该脚本将使用另一个xml文件(Web.config)中的模式更新xml文件中的版本以用于几个Web项目。让我说明一下我的意思。

版本是4个以句点分隔的数字(1.0.0.5,1.0.1.0等)。我想根据看起来像/[0-2].[0-2].[0-2].[0-2]/的模式自动化部署的增量。基本上是相同的,除了每个地方的值只能是0,1或2.值具有以下含义......

0 - 不要在此位置更改版本号

1 - 在此位置增加版本号

2 - 用

替换此位置的版本号

例如,如果我的版本号为1.0.0.8且架构为0.0.1.2,我想将版本号转换为1.0.1.0

这是我必须做的Powershell功能...

FUNCTION Increment-Version($path, $incrementSchema)
{
    # PATH IS PATH TO WEB PROJECT ROOT, INCREMENTSCHEMA IS THE SCHEMA  
    #GET CURRENT APP VERSION
    $projXml = New-Object XML
    $projXml.Load($path)
    $projXml.AppVersions.AppVersion.Version -match '(\d+)\.(\d+)\.(\d+)\.(\d+)'
    #VERSION MATCH IS NOW THE MATCHES VARIABLE FOR THE CURRENT PROJECT VERSION
    $versionMatch = $matches

    #EXTRACT SCHEMA
    $incrementSchema -match  '(\d+)\.(\d+)\.(\d+)\.(\d+)'
    #SCHEMAMATCH IS NOW THE INCREMENT SCHEMA MATCH OBJECT 
    $schemaMatch = $matches

    #ITERATE THROUGH ALL POSITIONS IN VERSION AND SCHEMA, THEY HAVE THE SAME 
    for ($i = 1; $i -lt 5; $i++) 
    {
        switch ($schemaMatch[$i])
        {
            0 {
                #HERE I WANT TO LEAVE THE $ITH POSITION OF THE VERSION ALONE
            }
            1 {
                #HERE I WANT OT INCREMENT THE $ITH POSITION OF THE VERISON BY 1
             }
            2 {
                #HERE I WANT TO SET $ITH POSITION OF VERSION TO 0
            }
            default {}
        }
    }

    # CODE TO SAVE VERSION XML FILE, ETC
}

我对如何实现案例逻辑有点迷失,我需要做的是根据在同一索引处找到的架构号替换版本的相关位置。

1 个答案:

答案 0 :(得分:1)

'1.0.0.8' -match '(\d+)\.(\d+)\.(\d+)\.(\d+)'
$versionMatch = $matches

'0.0.1.2' -match  '(\d+)\.(\d+)\.(\d+)\.(\d+)'
$schemaMatch = $matches

$NewVersion = ""

 for ($i = 1; $i -lt 5; $i++) 
{
    switch ($schemaMatch[$i])
    {
        0 {
            $NewVersion = $NewVersion,$versionMatch[$i] -join '.'
        }
        1 {
            $NewVersion = $NewVersion,(1 + $versionMatch[$i]) -join '.'
            #Try "1"+1 in PS, what do you get? A: "11" - String concatenation
            #Try 1+"1" in PS, what do you get? A: 2 - Integer addition
            #$versionMatch[$i] is a string; so to add 1 you need PS to see that you want to add numbers and not string concatenation.
            #There's a term for this; I don't know what it's called.
            }
        2 {
            $NewVersion = $NewVersion,"0" -join '.'
        }
        default {}
    }
}
$NewVersion = $NewVersion.SubString(1) #Remove the leading "."
Write-Output $NewVersion

它并不完美,但这是一个有趣的思想问题。