1. ホーム
  2. powershell

[解決済み] パワーシェルでのNull合体

2022-05-17 13:27:53

質問

powershellにnull合体演算子はありますか?

このようなc#のコマンドをpowershellでできるようにしたいのですが。

var s = myval ?? "new value";
var x = myval == null ? "" : otherval;

どのように解決するのですか?

パワーシェル 7+

Powershell 7 の紹介 ネイティブの NULL 合体、NULL 条件付き代入、および Powershell の三項演算子が導入されました。

Null合体

$null ?? 100    # Result is 100

"Evaluated" ?? (Expensive-Operation "Not Evaluated")    # Right side here is not evaluated

Null条件付き代入

$x = $null
$x ??= 100    # $x is now 100
$x ??= 200    # $x remains 100

三項演算子

$true  ? "this value returned" : "this expression not evaluated"
$false ? "this expression not evaluated" : "this value returned"


以前のバージョン

Powershell Community Extensionsは不要で、Powershell標準のif文を式として使用することができます。

variable = if (condition) { expr1 } else { expr2 }

で、最初のC#の式の置き換えに。

var s = myval ?? "new value";

は以下のいずれかになります(好みに応じて)。

$s = if ($myval -eq $null) { "new value" } else { $myval }
$s = if ($myval -ne $null) { $myval } else { "new value" }

または、$myvalが何を含むかによって、使用することができます。

$s = if ($myval) { $myval } else { "new value" }

であり、2番目のC#式も同様にマッピングされる。

var x = myval == null ? "" : otherval;

になる

$x = if ($myval -eq $null) { "" } else { $otherval }

さて、公平を期すために、これらはあまりきびきびしておらず、C#フォームのような使い心地にはほど遠いものです。

また、より読みやすくするために、非常にシンプルな関数でラップすることを考慮してもよいかもしれません。

function Coalesce($a, $b) { if ($a -ne $null) { $a } else { $b } }

$s = Coalesce $myval "new value"

またはIfNullとして可能性があります。

function IfNull($a, $b, $c) { if ($a -eq $null) { $b } else { $c } }

$s = IfNull $myval "new value" $myval
$x = IfNull $myval "" $otherval

ご覧のように、非常にシンプルな関数が、かなり自由な構文を与えることができます。

UPDATE: ミックスで考慮すべき1つの追加オプションは、より一般的なIsTrue関数です。

function IfTrue($a, $b, $c) { if ($a) { $b } else { $c } }

$x = IfTrue ($myval -eq $null) "" $otherval

そして、Powershellの演算子のようなエイリアスを宣言する機能を組み合わせると、次のようになります。

New-Alias "??" Coalesce

$s = ?? $myval "new value"

New-Alias "?:" IfTrue

$ans = ?: ($q -eq "meaning of life") 42 $otherval

明らかに、これはすべての人の好みに合うわけではありませんが、あなたが探しているものであるかもしれません。

Thomas が指摘するように、C# バージョンと上記のバージョンのもうひとつの微妙な違いは、C# は引数の短絡処理を行いますが、関数/エイリアスを含む Powershell バージョンは常にすべての引数を評価することです。もしこれが問題であれば if という表現形式を使います。