null の動作が一部だけ違います
代入してない変数は null で -eq $null すると True になります
-match するとマッチしないので False です
PS C:\> echo ($val -eq $null)
True
PS C:\> echo ($val -match "^A")
False
$null を代入した変数でも同じです
PS C:\> $v = $null
PS C:\> echo ($v -eq $null)
True
PS C:\> echo ($v -match "^A")
False
しかしコマンドの結果の場合は
PS C:\> $x = (node -e "null")
PS C:\> echo ($x -eq $null)
True
PS C:\> echo ($x -match "^A")
PS C:\>
-match のときに False が出ません
コマンドの実行結果なので空配列だったりするのかと思いましたが $x.gettype() は null のメソッド呼び出しとしてエラーになります
$x を表示しても空ですし -eq $null が True なので null のはずなのに
node コマンドは何も出力しないように -e "null" を指定しています
null を評価するだけでそれを出力しないので null が返ってくるわけではなく 標準出力に何も書き込まれないコマンドです
($x -match "^A") も null になっているのかと思って gettype() を呼び出してみるとなんと Object[] でした
PS C:\> ($x -match "^A").gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
意味がわからないのですがググっていると PowerShell の仕様として特殊な null が存在するようでした
https://learn.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-null?view=powershell-7.4#empty-null
実行ファイルに限らず PowerShell 上の関数でも 何も返さないものの結果である null は特殊な null で「Empty null」と呼ばれるものみたいです
実体は System.Management.Automation.Internal.AutomationNull.Value の値らしいです
この値は null と比較したり値の評価が行われるときは null として扱われるようです
なので
PS C:\> [System.Management.Automation.Internal.AutomationNull]::Value -eq $null
True
ですし 通常の null か判断できません
判断するには特殊な方法で配列に入れて Count を見ればいいようです
PS C:\> @($v).count
1
PS C:\> @($x).count
0
普通の null なら 1 で Empty null なら 0 になります
すごく特殊ですし こういうのはやめてほしいです
変なことしていて無理やり都合を合わせてる感
PHP みを感じます
もっと一貫性があって例外的なものが少ないようしてほしいです