ОБНОВЛЕНИЕ: Начиная с PowerShell 7 Preview 2, -not [System.DBNull]::Value
оценивается как $true
, благодаря Джоелу Саллоу через запрос на выгрузку 9794
Тратить больше времени на извлечение данных SQL в PowerShell. Проблемы с [System.DBNull] :: Value и как PowerShell ведет себя с этим во время сравнений.
Вот пример поведения, которое я вижу, наряду с обходными путями
#DBNull values don't evaluate like Null...
if([System.DBNull]::Value){"I would not expect this to display"}
# The text displays.
if([string][System.DBNull]::Value){"This won't display, but is not intuitive"}
# The text does not display.
#DBNull does not let you use certain comparison operators
10 -gt [System.DBNull]::Value
# Could not compare "10" to "". Error: "Cannot convert value "" to type "System.Int32". Error: "Object cannot be cast from DBNull to other types.""
[System.DBNull]::Value -gt 10
# Cannot compare "" because it is not IComparable.
#No real workaround. Must use test for null workaround in conjunction to avoid comparison altogether:
[string][System.DBNull]::Value -and [System.DBNull]::Value -gt 10
#Example scenario with a function that uses Invoke-Sqlcmd2 to pull data
Get-XXXXServer | Where-Object{$_.VCNumCPUs -gt 8}
#Error for every line where VCNumCPU has DBNull value
#workaround
Get-XXXXServer | Where-Object{[string]$_.VCNumCPUs -and $_.VCNumCPUs -gt 8}
Я что-то упустил, или нет "простого" обходного пути, позволяющего людям с небольшим опытом использовать сравнения PowerShell, как и ожидалось?
Я отправил предложение по Connect, и у меня есть временный обходной путь от Дэйва Уайетта, который преобразует datarow в psobject-объекты, а dbnulls преобразуется в нули, но это добавляет немного накладных расходов, Похоже, что-то, что должно быть обработано под прикрытием, учитывая существующее "свободное" поведение PowerShell?
Какие-нибудь советы или я уже исчерпал свои возможности?
Спасибо!