Командлет, который создает no , на самом деле не генерирует $null
- он (неявно) испускает [System.Management.Automation.Internal.AutomationNull]::Value
singleton , который в выражениях действует подобно $null
, но в контекстах перечисления , таких как конвейер, перечисляет ничто и, следовательно, ничего не отправляет через конвейер - в отличие от фактического $null
значение.
# True $null *is* sent through the pipeline.
PS> $var = $null; $var | ForEach-Object { 'here' }
here
# [System.Management.Automation.Internal.AutomationNull]::Value is *not*.
# `& {}` is a simple way to create this value.
PS> $var = & {}; $var | ForEach-Object { 'here' }
# !! No output
Начиная с PowerShell 7.0, [System.Management.Automation.Internal.AutomationNull]::Value
можно обнаружить только косвенно , используя скрытые методы такие следующим образом:
# Only returns $true if $var contains
# [System.Management.Automation.Internal.AutomationNull]::Value
$null -eq $var -and @($var).Count -eq 0
Это отсутствие обнаруживаемости проблематично c, и улучшение ситуации путем включения следующего является предметом этого предложения GitHub .
$var -is [AutomationNull] # WISHFUL THINKING as of PowerShell 7.0