То, что вы ищете, это объединение нулей , которого нет в PowerShell по состоянию на v7.0.0-preview.4.
Покадля этого нужно сделать:
$contentDir = if ($null -eq $config.contentDir) { 'content' } else { $config.contentDir }
Примечание: $null
специально помещен на LHS -eq
, чтобы однозначно проверить на $null
, потому что как RHS он будет действовать как фильтр , если проверяемое значение оказывается массивом -оценным.
Адаптация ответа Ли Дейли на основе массива включает более краткое решение:
$contentDir = ($config.ContentDir, 'content')[$null -eq $config.ContentDir]
Использование троичного оператора (условного) , который будет реализован в v7.0, включает аналогично краткий эквивалент:
$contentDir = $null -eq $config.contentDir ? 'content' : $config.contentDir
Однако все эти подходы имеют следующие нежелательные аспекты :
Они требуют явной ссылкидо $null
;обратите внимание, что if ($config.ContentDir)
- то есть приведение значения к логическому значению - может работать с строками , но, как правило, не является устойчивым, поскольку значения, отличные от $null
, такие как 0
, могут также принимать значение $false
.
$config.contentDir
, значение для проверки $null
, должно быть получено дважды , что может иметь побочные эффекты.
Определение пользовательской функции с именем, скажем, ??
, может решить следующие проблемы:
# Custom function that emulates null-coalescing.
function ?? ($PossiblyNull, $ValueIfNull) {
if ($null -eq $PossiblyNull) { $ValueIfNull } else { $PossiblyNull }
}
$contentDir = ?? $config.contentDir 'content'
Однако такая пользовательская функция имеет оборотные стороны :
недостатками пользовательских функций являются:
Вам необходимо включить или импортировать их в каждый фрагмент кода, в котором вы хотите их использовать.
Если вы выберете знакомое имя, такое как ??
, размещение операндов может запутаться , поскольку вы должны (неизменно) размещать их по-разному в PowerShell, учитывая реализацию в виде функции (например, a ?? b
в C # и ?? $a $b
в PowerShell) - especiсоюзник, когда в PowerShell реализовано истинное объединение нулей: см. следующий раздел.
И, конечно, вызов функции добавляет издержки.
Если реализован этот запрос функции GitHub , вы сможете использовать true null-coalescing , который одновременно является наиболее лаконичным решением и избегает вышеупомянутых нежелательных аспектов :
# Hopefully soon
$contentDir = $config.contentDir ?? 'content'
Связанная функция, также предложенная в связанном выпуске GitHub, - нулевое условное назначение , $config.ContentDir ?= 'content'