Преобразование типа DataRow в версию и переход по списку версий - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над сценарием, часть его работы состоит в том, чтобы получить список версий из таблицы в моей базе данных SQL и сравнить их с версией в файле. Если любой из номеров версий в БД выше, чем у файла, сценарий должен выйти из строя и не продолжаться, даже если некоторые из версий в базе данных пройдут (в основном самая высокая версия должна быть той, определяет, не работает ли сценарий). Для справки: SQL Cmd экспортирует что-то вроде этого:

Column1
-------
2019.3.3
2020.3
4.21.0.3
4.24.0.1
4.26.0.2
4.27.2
4.27.3
4.27.7
4.33.10

Скрипт выглядит следующим образом.

. .\Get-AppVersion.ps1

# Get latest version in the server_long_entry table
$databaseVersion = Invoke-Sqlcmd -ServerInstance $DBInstance -Database $DBName -Query "SELECT DISTINCT SUBSTRING([version], 0, CASE WHEN PATINDEX('%.[^0-9.]%', [version]) <> 0 THEN PATINDEX('%.[^0-9.]%', [version]) ELSE 100 END) FROM dbo.server_log_entry"

$databaseVersion = $databaseVersion | Select-Object Column1

#Calls custom function to get version of the file as System.Version type
$version = Get-AppVersion $Source 

# Checks to make sure the the version in the DB is lower than that of the App version.
foreach($versionofdb in $databaseVersion) {
    if ($version -lt [version]$versionofdb) { 
        Write-Error "Database Version is a higher version than Instance Version. Unable to continue"
    } else {
        Write-Output "Versions compatible"
    }
}

Когда я запускаю это, он сообщает

Невозможно преобразовать значение "@ {Column1 = 2019.3.3}" в тип "System.Version". Ошибка: «Невозможно преобразовать значение« @ {Column1 = 2019.3.3} »типа« Selected.System.Data.DataRow »в тип« System.Version ».

Я знаю, что это потому что он пытается преобразовать тип DataRow в System.Version, но мне сложно понять, как это исправить. Если бы запрос SQL возвращал только одно значение, я думаю, что мог бы использовать

$databaseVersion = $databaseVersion.ItemArray[0].ToString()

Но в этом случае список вызывает у меня проблемы.

1 Ответ

0 голосов
/ 10 июля 2020

Как написано сейчас, $versionofdb относится к типу [PSCustomObject]. Вам нужно преобразовать строку в тип [version]. Используйте $versionofdb.Column1 следующим образом (немного упрощенно):

$databaseVersion = @'
Column1
2019.3.3
2020.3
4.21.0.3
4.27.7
4.33.10
'@ | ConvertFrom-Csv

#Calls custom function to get version of the file as System.Version type
### $version = Get-AppVersion $Source ### can't reproduce
$version = $PSVersionTable.PSVersion 

# Checks to make sure the the version in the DB is lower than that of the App version.
foreach($versionofdb in $databaseVersion) {
    if ($version -lt [version]$versionofdb.Column1) { 
        ###                               ↑↑↑↑↑↑↑↑
        Write-Output "Database Version $($versionofdb.Column1) >= $version"
    } else {
        Write-Output "Versions $($versionofdb.Column1) < $version`: compatible"
    }
}
Database Version 2019.3.3 >= 5.1.19041.1
Database Version 2020.3 >= 5.1.19041.1
Versions 4.21.0.3 < 5.1.19041.1: compatible
Versions 4.27.7 < 5.1.19041.1: compatible
Versions 4.33.10 < 5.1.19041.1: compatible
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...