Я работаю над сценарием, часть его работы состоит в том, чтобы получить список версий из таблицы в моей базе данных 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()
Но в этом случае список вызывает у меня проблемы.