0 -eq "" は$true

SqlServerから取ってきたDataTableをHTMLでテーブルにして表示する、というスクリプトPowerShellで書いていて、以下のような感じなんです。


function Write-HTML($dt, $name){
$str = "<h2>$($name)</h2><table>"

$str += "<tr>"
$dt.Columns | % { $str += "<th>" + $_.ColumnName + "</th>" }
$str += "</tr>"

foreach($row in $dt.Rows){
$str += "<tr>"
0 .. ($dt.Columns.Count - 1) | % { $str += "<td nowrap>" + (Format-DBData $row[$_]) + "</td>" }
$str += "</tr>"
}
$str += "</table>"
$SCRIPT:html += $str
}

function Format-DBData($v){
if($v -eq [System.DBNull]::Value) { return "<i><b>DBNull</b></i>" }
if("" -eq $v) { return "<i><b>空</b></i>" }
if($v -match "^\s+$") { return "<i><b>スペース × {0}</b></i>" -f $v.Length }
$ret = [System.Web.HttpUtility]::HtmlEncode($v).Replace("`n", "<br />")
return $ret
}

二つ目のfunctionでは、テーブルのカラムにDBNullが入っていたらDBNull、空文字列がはいっていたら、などと変換して返します。で、この関数の二行目、if("" -eq $v) の部分は、最初 if($v -eq "") と書いてたんですがそうするとやたらにになる。どうも、int型とかで値に0が入ってるとになるなぁと思って調べてたら

0 -eq ""

がTrueなんですよ。

"" -eq 0

はFalseなんだけど。たぶん、演算子の左側に合わせて右がまずキャストされて、

[int]""

は0なので、Trueが返ってくると思うんですけど。ちょっと不気味。そんだけです……