0 -eq "" は$true
SqlServerから取ってきたDataTableをHTMLでテーブルにして表示する、というスクリプトをPowerShellで書いていて、以下のような感じなんです。
二つ目のfunctionでは、テーブルのカラムにDBNullが入っていたらDBNull、空文字列がはいっていたら、空などと変換して返します。で、この関数の二行目、if("" -eq $v) の部分は、最初 if($v -eq "") と書いてたんですがそうするとやたらに空になる。どうも、int型とかで値に0が入ってると空になるなぁと思って調べてたら
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
}
0 -eq ""
がTrueなんですよ。
"" -eq 0
はFalseなんだけど。たぶん、演算子の左側に合わせて右がまずキャストされて、
[int]""
は0なので、Trueが返ってくると思うんですけど。ちょっと不気味。そんだけです……