Доступ к несуществующему свойству хеш-таблицы ведет себя по-разному в модуле и вне его.

В сценарии PowerShell или простом однофайловом модуле psm1 доступ к несуществующему свойству хеш-таблицы возвращает $ null.

$hashtable = @{}
$hashtable.NonExistentKey -eq $null # returns true

Но когда этот код является частью правильного модуля с манифестом psd1, тот же код выдает исключение.

Свойство NonExistentKey не может быть найдено для этого объекта. Убедитесь, что свойство существует.

Может кто знает, в чем причина такого поведения и можно ли его изменить?

UPD: я знаю, что ContainsKey - правильный способ, но он касается выполнения устаревшего кода и другого поведения в целом.

UPD2: Set-StrictMode действительно имел место. Спасибо всем!


person Andrey Ershov    schedule 26.11.2018    source источник
comment
Set-StrictMode. Скорее всего, этот модуль активен (и это хорошая практика). Используйте .ContainsKey, чтобы проверить, есть ли ключ, прежде чем обращаться к нему.   -  person Jeroen Mostert    schedule 26.11.2018
comment
В любом случае вам не следует проверять наличие такого ключа. В хэш-таблицах есть метод ContainsKey() именно для этой цели.   -  person Ansgar Wiechers    schedule 26.11.2018
comment
Если это устаревший код, просто снова выключите строгий режим: Set-StrictMode -Off. Его эффекты ограничены, поэтому при необходимости вы можете применять его выборочно. Существует довольно много способов настроить строгий режим и установить предпочтение по умолчанию, поэтому в модуле никогда не стоит полагаться на какой-либо конкретный режим, который действует.   -  person Jeroen Mostert    schedule 26.11.2018


Ответы (1)


Как указано выше @Jeroen Mostert, строгий режим может быть активен.

Сеанс PowerShell с активным строгим режимом:

> Set-StrictMode -Version 2.0
> $d = @{}
> $d.SomeNotExistingKey
The property 'SomeNotExistingKey' cannot be found on this object. Verify that the property exists.
At line:1 char:1
+ $d.SomeNotExistingKey
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
+ FullyQualifiedErrorId : PropertyNotFoundStrict

Сессия PowerShell БЕЗ активного строгого режима:

> $d = @{}                    
> $d.SomeNotExistingKey      

Из MSDN :

... Когда включен строгий режим, Windows PowerShell генерирует прерывающую ошибку, когда содержимое выражения, сценария или блока сценария нарушает основные рекомендуемые правила кодирования.

надеюсь, это поможет

person Moerwald    schedule 26.11.2018