如何使用powershell查找二进制(8)数组中的最大值?

如何使用powershell查找二进制(8)数组中的最大值?,powershell,rowversion,Powershell,Rowversion,我正试图通过使用 function ExecuteSqlQuery ($SQLQuery) { try { $Datatable = New-Object System.Data.DataTable $Connection = New-Object System.Data.SQLClient.SQLConnection $Connection.ConnectionString = $connStr $Connection.Open() $Command = New-Object Sys

我正试图通过使用

function ExecuteSqlQuery ($SQLQuery) {
try 
{
$Datatable = New-Object System.Data.DataTable    
$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = $connStr
$Connection.Open()
$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection
$Command.CommandText = $SQLQuery
$Command.CommandTimeout=$commandTimeout
$Reader = $Command.ExecuteReader()
$Datatable.Load($Reader)
return $Datatable
}

$data= ExecuteSqlQuery "Select col1,col2,col3, RowVersion from table"
$byteArray = [System.Collections.ArrayList]@()
foreach ($row in $data) {

   $byteArray.Add($row.Item("RowVersion"))
}

$max=($byteArray | Measure-Object -Maximum).Maximum 
Write-host $max
但我有一个错误:

错误:错误:无法比较“System.Byte[]”,因为它不是 不可比

然后我尝试转换为int64并找到最大值

$byteArray = [System.Collections.ArrayList]@()
foreach ($row in $data) {

   $byteArray.Add([bitconverter]::ToInt64($row.Item("RowVersion"),0))
}
Write-Host ($byteArray | Measure-Object -Maximum).Maximum 
$max=[Convert]::ToByte(($byteArray | Measure-Object -Maximum).Maximum)   
Write-host $max
但仍有一个错误,输出:

9.1298706847202E+18
2017-10-25 21:00:51错误:错误:对于>Int32

有什么办法可以解决这个问题吗
从SQL将二进制文件转换为int32 retuns 0

二进制文件(8)
应在PowerShell中表示为
[byte[]]
,因此您有一个字节数组的数组列表。在.Net Framework中,没有内置的方法将字节数组与其他字节数组进行比较以进行排序。该行为没有定义,因此您必须定义它或定义一个算法

假设第一个字节是最重要的,第二个字节是下一个最重要的,依此类推,您应该能够通过如下操作获得“最大值”:

$byteArray | Sort-Object -Property {$_[0]},{$_[1]},{$_[2]},{$_[3]},{$_[4]},{$_[5]},{$_[6]},{$_[7]} -Descending | Select-Object -First 1
这只查看前8个字节,但是,如果基类型实际上是二进制(8),则字段中只有8个字节


如果这不起作用,那么您必须遍历ArrayList,通过比较字节数并保存最大值,自己找到最大值。

如果您只需要最大值,可以使用sql进行此操作:

Select col1,col2,col3, RowVersion from table order by RowVersion desc
然后,您的第一行包含max

试试这个

$byteArray.Add([System.Text.Encoding]::ASCII.GetString($row.Item("RowVersion")))

请不要添加不相关的标签。Powershell甚至不接近您的示例。如果示例不完整(
$data
未在任何地方定义),您可以交替使用
$byteArray
$dateArray
,并且没有指示抛出错误的位置。你能至少发布整个错误消息吗?@MathiasR.Jessen,thax请注意,我已经编辑了这篇文章。在第一个示例中抛出错误
$max=($byteArray | Measure Object-Maximum)。Maximum
,第二个
$max=[Convert]::ToByte($byteArray | Measure Object-Maximum)。Maximum)
对于值0x0000000005378C51,它返回0 0 5 55 140 81,我无法理解这一点=(@PavelGalich 0x51=81.PowerShell将字节数组显示为十进制值。如果希望将其作为十六进制值,则需要对其进行转换。类似于
'0x'+($Max | ForEach Object{$\ ToString('X2')))-连接[String]::Empty
。这就是答案。感谢您在sql中,从RowVersion中查找最大值非常简单,但我必须从powershell中查找。为什么在您的情况下使用powershell?我的第二个解决方案不起作用?