Нулевое условие в Powershell? - PullRequest
       13

Нулевое условие в Powershell?

1 голос
/ 25 октября 2019

C # и другие языки обычно имеют нулевые условия ?.

A?.B?.Do($C);

Не выдает ошибку, когда A или B равны нулю. Как мне добиться чего-то похожего в PowerShell, что лучше сделать:

if ($A) {
  if ($B) {
    $A.B.Do($C);
  }
}

Ответы [ 3 ]

1 голос
/ 25 октября 2019

В Powershell 7 Preview 5 есть операторы, работающие с нулями. https://devblogs.microsoft.com/powershell/powershell-7-preview-5/

$a = $null

$a ?? 'is null' # return $a or string if null
is null

$a ??= 'no longer null'  # assign if null

$a ?? 'is null'
no longer null
1 голос
/ 27 октября 2019

Как указывает ответ Матиаса Р. Джессена , PowerShell по умолчанию имеет нулевой условный режим доступа (пропускающий ноль) относительно доступа к свойству [1] * * 1 010;например, $noSuchVar.Prop спокойно возвращает $null

ответ js2010 показывает связанный нуль-коалесцирующий оператор (??) / ноль-условие-операторы (??=), которые уже реализованы , хотя только как экспериментальная функция в PowerShell Core 7.0.0-preview.5.

Однако:

  • Невозможно условно игнорировать метод вызовы: $noSuchVar.Foo() всегда терпит неудачу.

  • Точно так же невозможно игнорировать NULL (массив) индексирование : $noSuchVar[0] всегда завершается неудачей.

  • Если вы выберетев * более строгом поведении с Set-StrictMode, даже нулевое пропитывание доступа к свойству больше не является опцией: при Set-StrictMode -Version 1 или выше $noSuchVar.Prop приводит к ошибке.

Начиная с PowerShell Core 7.0.0-preview.5, безусловные (пропускающие ноль) операторы запланированы , но еще не реализованы :

Как оВ этом письме согласно соответствующему RFC (после обсуждения в в этом выпуске ) операторы:

  • будут иметь такую ​​же форму, какв C # в принципе (?. и ?[...])

  • , но потребует включения имени переменной в {...}

То есть вы не сможете использовать только $A?.B, вам придется использовать ${A}?.B

Причинаэтот громоздкий синтаксис состоит в том, что существует проблема обратной совместимости , потому что ? является допустимым символом в именах переменных, поэтому гипотетически существующий код, такой как $var? = @{ one = 1}; $var?.one, может сломаться без использования {...} для устранения неоднозначностиимя переменной.

Если вы считаете, что не загромождать новый синтаксис важнее, чем потенциально нарушающие сценарии с именами переменных, заканчивающимися на ?, сделает ваш голос услышанным на RFC .


[1] стандартное поведение PowerShell даже предлагает существование -условный доступ к недвижимости;например, $someObject.NoSuchProp тихо возвращает $null.

1 голос
/ 25 октября 2019

PowerShell не имеет условного оператора null, но он молча игнорирует свойство ссылок на выражения с нулевым значением, поэтому вы можете просто «пропустить» вызов метода в конце цепочки:

if($null -ne $A.B){
  $A.B.Do($C)
}

Работает на любой глубине:

if($null -ne ($target = $A.B.C.D.E)){
    $target.Do($C)
}
...