PowerShell Core имеет семантическое управление версиями, который включает новый ускоритель типов под названием [semver]
и основан на System.Management.Automation.SemanticVersion
.
Чтобы протестировать этот конкретный тип в среде PowerShell Core, вы, вероятно, использовали бы синтаксис:
$PSVersionTable.PSVersion -is [semver]
Но если вы реализуете это в сценарии и запустите его в Windows PowerShell, вы получите сообщение об ошибке:
Unable to find type [semver]. At line:1 char:31 + $PSVersionTable.PSVersion -is [semver] + ~~~~~~~~ + CategoryInfo : InvalidOperation: (semver:TypeName) [], RuntimeException + FullyQualifiedErrorId : TypeNotFound
Аналогичная ошибка появляется, когда я сравниваю его с именем типа (string
):
$PSVersionTable.PSVersion -is `semver`
Cannot convert the "semver" value of type "System.String" to type "System.Type". At line:1 char:1 + $PSVersionTable.PSVersion -is 'semver' + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException
(Было бы хорошо/правильно, если бы PowerShell различал предоставление [Type]
или 'String'
в качестве сравнения и просто возвращал $False
, если строка не может быть преобразована)
Как лучше всего проверить тип и предотвратить любую ошибку, если тип неизвестен (как это происходит с -is
для определенных типов в конкретной среде)?
try/catch
? - person Lee_Dailey   schedule 05.09.2019Try{$IsType = $PSVersionTable.PSVersion -is [semver]} Catch{$IsType = $Null}; If ($IsType) {...
, и я обычно стараюсь избегать блоковTry/Catch
, насколько это возможно. - person iRon   schedule 05.09.2019try/catch
кажутся эффективными, поэтому используйте то, что соответствует вашему стилю. [усмехнуться] - person Lee_Dailey   schedule 05.09.2019