Как сравнить две строковые версии с помощью Powershell? - PullRequest
0 голосов
/ 27 июня 2019

Привет у меня ниже двух строк

$str1 = "Ubuntu 16.04 LTS"
$str2 = "Ubuntu 16.04.6 LTS"

Q.

  1. Если оба совпадения, тогда это правда
  2. $ str1> "Ubuntu 16.04 LTS", тогда это правда
  3. $ str1 = "Ubuntu 16.04.01 LTS", тогда это правда
  4. $ str1 <"Ubuntu 16.04 LTS", тогда это ложно </li>
  5. $ str1> "Ubuntu 16.05 LTS", тогда это ложно

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Использование фрейма MehmetSeckin s ответа, но

  • приведение номера версии к типу [version], как предложено robdy
  • проверка версии Major и Minor.
  • также проверяет строку Distro и суффикс.
  • вывод а [PSCustomObject]
## Q:\Test\2019\06\27\SO_56788705.ps1
function Compare-UbuntuVersions {
    param(
        [string]$VerString1,
        [string]$VerString2
    )
    $Dist1,[version]$Version1,$Suffix1 = $VerString1 -split ' '
    $Dist2,[version]$Version2,$Suffix2 = $VerString2 -split ' '
    If(($Dist1 -eq $Dist2) -and
       ($Suffix1 -eq $Suffix2) -and
       ($Version1.Major -eq $Version2.Major) -and
       ($Version1.Minor -eq $Version2.Minor)) {
        return $True
    } Else {
        return $False
    }
}

$targetVersion = "Ubuntu 16.04 LTS"

$versions = @(
    "Ubuntu 16.04 LTS",
    "Ubuntu 16.04.01 LTS",
    "Ubuntu 16.04.6 LTS",
    "Ubuntu 16.05 LTS"
)

$versions | ForEach-Object { 
   [PSCustomObject]@{
       Target = $targetVersion
       Version= $_
       Match  = Compare-UbuntuVersions $targetVersion $_
   }
}

Пример вывода:

> Q:\Test\2019\06\27\SO_56788705.ps1

Target           Version             Match
------           -------             -----
Ubuntu 16.04 LTS Ubuntu 16.04 LTS     True
Ubuntu 16.04 LTS Ubuntu 16.04.01 LTS  True
Ubuntu 16.04 LTS Ubuntu 16.04.6 LTS   True
Ubuntu 16.04 LTS Ubuntu 16.05 LTS    False
1 голос
/ 27 июня 2019

Вот быстрый метод с использованием регулярных выражений:

function Compare-UbuntuVersions {
    param
    (
        [string]$Version1,
        [string]$Version2
    )

    $versionRegex = "(?<Version>\d+\.\d+\.?(\d+)?)";
    if ($Version1 -match $versionRegex)
    {
        $v1 = [version]$matches.Version;
    }
    else
    {
        throw "Invalid version string";
    }

    if ($Version2 -match $versionRegex)
    {
        $v2 = [version]$matches.Version;
    }
    else
    {
        throw "Invalid version string";
    }

    if($v1 -gt $v2)
    {
        Write-Host "$Version1 is greater than $Version2";
        return 1;
    }
    elseif ($v1 -eq $v2) 
    {
        Write-Host "$Version1 is equal to $Version2";
        return 0;
    }
    elseif ($v1 -lt $v2) 
    {
        Write-Host "$Version1 is less than $Version2";
        return 0;
    }
}

$targetVersion = "16.04";
$versions = @(
    "Ubuntu 16.04 LTS",
    "Ubuntu 16.04.01 LTS",
    "Ubuntu 16.04.6 LTS",
    "Ubuntu 16.05 LTS"
)

$versions | % { $null = Compare-UbuntuVersions $_ $targetVersion }

# Ubuntu 16.04 LTS is equal to 16.04
# Ubuntu 16.04.01 LTS is greater than 16.04
# Ubuntu 16.04.6 LTS is greater than 16.04
# Ubuntu 16.05 LTS is greater than 16.04
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...