I was using the code provided above:
Get-View -ViewType HostSystem | Select Name,@{N="BIOS version";E={$_.Hardware.BiosInfo.BiosVersion}},
@{N="BIOS date";E={$_.Hardware.BiosInfo.releaseDate}}
It worked fine if I would connect-viserver to the individual ESXi hosts, but when pointing at vCenter it only worked for 3 of 16 hosts. After a little bit of Googling, I think I found someone else who has encountered this problem -- http://www.sandfordit.com/vwiki/index.php?title=VI_Toolkit_(PowerShell)
That page has a "ESX Inventory Getter" script that checks for the Hardware.BiosInfo value and uses it if available. However, it will fail to a section that parses the Runtime.HealthSystemRuntime.SystemHealthInfo.NumericSensorInfo information if needed. I switched to just the Runtime.HealthSystemRuntime.SystemHealthInfo.NumericSensorInfo section and can now get the BIOS values for all 16 hosts. The code isn't as clean as what you provided, but appears to work on all my hosts:
$report = @()
Get-View -ViewType HostSystem | %{
$row = "" |Select Name, "BIOS Version", "BIOS Date"
$row.name = $_.name
$biosTemp = ((($_.Runtime.HealthSystemRuntime.SystemHealthInfo.NumericSensorInfo | Where {$_.Name -like "*BIOS*"}).Name -split "BIOS ")[1] -split " ")
$row."BIOS Version" = $biosTemp[0]
$row."BIOS Date" = $biosTemp[1]
$report += $row
}
$report