Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
2807 / 505 / 121
Регистрация: 26.09.2020
Сообщений: 959
Записей в блоге: 5

Парсинг версий, ожидаемый результат

26.07.2025, 22:20. Показов 4051. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какие бы вы ожидали результаты от парсинга версий?

PowerShell
1
2
3
4
5
6
7
8
 $tests1 = @(
    @{ Input = "1"; Expected = "1.0" }
    @{ Input = "1.05"; Expected = "1.5" }
    @{ Input = "v2.0.1"; Expected = "2.0.1" }
    @{ Input = "3.0.0.5"; Expected = "3.0.0.5" }
    @{ Input = "01.02.003"; Expected = "1.2.3" }
    @{ Input = "22.10.01.105"; Expected = "22.10.1.105" }
)
PowerShell
1
2
3
4
5
6
7
8
$tests2 = @(
    @{ Input = "1"; Expected = "1.0" }
    @{ Input = "1.05"; Expected = "1.0.5" }
    @{ Input = "v2.0.1"; Expected = "2.0.1" }
    @{ Input = "3.0.0.5"; Expected = "3.0.0.5" }
    @{ Input = "01.02.003"; Expected = "1.0.2.0" }
    @{ Input = "22.10.01.105"; Expected = "22.10.0.1" }
)
Какие ещё варианты написания версий вы знаете?

Имеющиеся функция:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function ParseVersion {
<#
.SYNOPSIS
    Парсит строку версии в объект [version].
 
.DESCRIPTION
    Преобразует строку версии в объект [version],
    удаляя все нечисловые символы, кроме точек.
    Автоматически добавляет «.0» если в версии указан только MAJOR компонент.
    Для чего — Объекты [version] можно сравнивать между собой.
 
.PARAMETER version
    Строка версии для парсинга (например, "v1.2.3" или "1.0.0-beta").
 
.EXAMPLE
    ParseVersion.ps1 "..1.."      # → 1.0
    ParseVersion.ps1 "1"          # → 1.0
    ParseVersion.ps1 "v2.5.1"     # → 2.5.1
    ParseVersion.ps1 "3.0.0-beta" # → 3.0.0
 
.NOTES
    Автор: iNNOKENTIY21
    Дата: 17.07.2025
#>
 
    param (
        [string] $Version
    )
 
    # Проверка на пустую строку или пробелы
    if ([string]::IsNullOrWhiteSpace($Version)) {
        throw "Параметр «Version» не может быть пустым."
    }
 
    # Очистка от всех знаков, кроме цифр и точек
    $cleaned = ($Version -replace '[^0-9.]', '').Trim('.')
 
    # Проверка наличия хотя бы одной цифры
    if (-not [regex]::IsMatch($cleaned, '\d')) {
        throw "Строка версии «$Version» не содержит цифр."
    }
 
    # Автоматическое добавление .0 если нужно, типа "1" → "1.0"
    if ($cleaned -notmatch '^\d+\.') {
        $cleaned += '.0'
    }
 
    try {
        return [version]::Parse($cleaned)
    }
    catch {
        $errMsg = $_.Exception.Message
        throw "Невозможно распознать версию из «$Version» ($cleaned): $errMsg"
    }
}
её тест:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
foreach ($test in $tests1) {
    $result = ParseVersion $test.Input
    $expected = [version]$test.Expected
 
    if ($result -eq $expected) {
        Write-Host "✅ '$($test.Input)' → $result" -ForegroundColor Green
    }
    else {
        Write-Host "❌ '$($test.Input)' → $result (ожидалось: $expected)" -ForegroundColor Red
    }
}
и вывод теста:
PowerShell
1
2
3
4
5
6
✅ '1' → 1.0
✅ '1.05' → 1.5
✅ 'v2.0.1' → 2.0.1
✅ '3.0.0.5' → 3.0.0.5
✅ '01.02.003' → 1.2.3
✅ '22.10.01.105' → 22.10.1.105
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.07.2025, 22:20
Ответы с готовыми решениями:

Синхронизация расшареных ресурсов с контролем версий
Здравствуйте. Подскажите, существует ли возможность синхронизации расшареных ресурсов с контролем...

Посоветуйте книжки и дайте ссылку по переустановке разных версий Windows
Прочитал около десятка книг хочу еше больше прочитать, собираюсь практиковать переустановку, меня...

Загрузка разных версий Windows
Помогите пожалуйста:) На ПК две системы: Вин 7 и Вин ХР. Выбираю в загрузчике семёрку - всё...

40
2807 / 505 / 121
Регистрация: 26.09.2020
Сообщений: 959
Записей в блоге: 5
03.08.2025, 18:59  [ТС]
Студворк — интернет-сервис помощи студентам
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# С генерацией исключений
function Get-VersionFromString {
    param (
        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias('Version')]
        [string] $InputString,
 
        [switch] $AllMatches
    )
 
    process {
        if ([string]::IsNullOrWhiteSpace($InputString)) {
            $msg = 'Параметр «InputString» не может быть пустым.'
 
            $PSCmdlet.ThrowTerminatingError(
                [System.Management.Automation.ErrorRecord]::new(
                    [System.ArgumentNullException]::new($msg),
                    'InputStringIsEmpty',
                    [System.Management.Automation.ErrorCategory]::InvalidArgument,
                    $InputString
                )
            )
        }
 
        if ($InputString.Length -lt 3) {
            $msg = 'Длина строки «InputString» должны быть не меньше 3 знаков.'
 
            $PSCmdlet.ThrowTerminatingError(
                [System.Management.Automation.ErrorRecord]::new(
                    [System.ArgumentOutOfRangeException]::new($msg),
                    'InputStringIsTooShort',
                    [System.Management.Automation.ErrorCategory]::InvalidArgument,
                    $InputString
                )
            )
        }
 
        if ($InputString.Length -gt 255) {
            $msg = 'Длина строки «InputString» не должна превышать 255 знаков.'
 
            $PSCmdlet.ThrowTerminatingError(
                [System.Management.Automation.ErrorRecord]::new(
                    [System.ArgumentOutOfRangeException]::new($msg),
                    'InputStringIsTooLong',
                    [System.Management.Automation.ErrorCategory]::InvalidArgument,
                    $InputString
                )
            )
        }
 
        $match = [regex]::Matches($InputString, '\d+(\.\d+){0,3}')
 
        if (-not $match) {
            $msg = "«$InputString» — нет совпадений с шаблоном версий."
 
            $PSCmdlet.ThrowTerminatingError(
                [System.Management.Automation.ErrorRecord]::new(
                    [System.ArgumentException]::new($msg),
                    'NotMatchTemplate',
                    [System.Management.Automation.ErrorCategory]::InvalidArgument,
                    $InputString
                )
            )
        }
 
        try {
            if ($AllMatches) {
                return $match |
                    Where-Object value -Match '\.' |
                    ForEach-Object { [version]::Parse($_.Value) }
            } else {
                $value = ($match | Where-Object value -Match '\.')[0]
                return [version]::Parse($value)
            }
        } catch {
            $msg = "«$($match.Value)» — не удалось преобразовать в версию."
 
            $PSCmdlet.ThrowTerminatingError(
                [System.Management.Automation.ErrorRecord]::new(
                    [Exception]::new($msg, $_.Exception),
                    'VersionParseError',
                    [System.Management.Automation.ErrorCategory]::ParserError,
                    $InputString
                )
            )
        }
    }
}
PowerShell
1
2
3
4
5
6
7
8
9
10
# TryParse в конвейере
function ConvertTo-Version {
    process {
        $match = [regex]::Matches($_, '\d+(\.\d+){0,3}')
        $version = [version]::new()
        $value = ($match | Where-Object value -Match '\.')[0]
        [void] ([version]::TryParse($value, [ref] $version))
        return $version
    }
}
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Свойство расширения с TryParse
$ParseVersion = [scriptblock] {
    $match = [regex]::Matches($this, '\d+(\.\d+){0,3}')
    $version = [version]::new()
    $value = ($match | Where-Object value -Match '\.')[0]
    [void] ([version]::TryParse($value, [ref] $version))
    return $version
}
 
$TypeData = @{
    TypeName   = 'System.String'
    MemberType = 'ScriptProperty'
    MemberName = 'Version'
    Value      = $ParseVersion
}
 
Update-TypeData @TypeData -Force
PowerShell
1
2
3
4
5
6
# Вызов
'x64: v1.2.3.4 beta 10 x86_64 или v5.6.7.8_x64'.Version
'x64: v1.2.3.4 beta 10 x86_64 или v5.6.7.8_x64' | ConvertTo-Version
 
Get-VersionFromString -InputString 'x64: v1.2.3.4 beta 10 x86_64 или v5.6.7.8_x64'
'x64: v1.2.3.4 beta 10 x86_64 или v5.6.7.8_x64' | Get-VersionFromString -AllMatches
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2025, 18:59

Определение номеров версий файлов и занесение результатов в массив
всем доброго времени суток)) прошу прощения за свою неосведомлённость в плане принципов общения на...

Запретить запуск отдельных программ, старых версий
Требуется запретить использование старых версий некоторых программ. Почти все они в варианте...

Создать список имён компьютеров и версий используемого на них почтового клиента
Добрый день! Ситуация такая... В сети есть порядка 800 компьютеров, на которых в одном и том же...

Поиск новейших версий файлов из одноимённых файлов, находящихся в двух каталогах, и перенос найденных в третий
Здравствуйте. Возникла необходимость в создании кода на batch, который делает следующее. Сначала...

Необходимо ли иметь на Live-реаниматоре несколько версий MSDaRT?
Необходимо ли что на Live-реаниматоре нужно иметь несколько версий MSDaRT-а, чтоб мочь применять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru