如何使用 powershell 在 binary(8) 数组中找到最大值?
How to find the maximum in array of binary(8) using powershell?
我正在尝试使用
找到最大值
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
但是我得到一个错误:
ERROR: Error: Cannot compare "System.Byte[]" because it is not
IComparable
然后我尝试转换为 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 ERROR: Error: Value was either too large or too small for >an Int32..
有什么方法可以解决吗?
将二进制转换为 int32 返回 0
SQL 中的 binary(8)
在 PowerShell 中应表示为 [byte[]]
,因此您有一个字节数组的 ArrayList。在 .Net Framework 中没有内置方法可以将字节数组与其他字节数组进行排序。该行为未定义,因此您必须定义它或以其他方式定义算法。
假设第一个字节是最重要的,第二个是次重要的,依此类推,您应该可以通过执行以下操作来获得 "maximum" 它:
$byteArray | Sort-Object -Property {$_[0]},{$_[1]},{$_[2]},{$_[3]},{$_[4]},{$_[5]},{$_[6]},{$_[7]} -Descending | Select-Object -First 1
这只查看前 8 个字节,但是,如果基类型确实是 binary(8)
,则字段中只有 8 个字节。
如果这不起作用,则您必须遍历 ArrayList 并通过比较字节并保存最大值来自行找到最大值。
如果你只想要最大值,你可以使用 sql :
Select col1,col2,col3, RowVersion from table order by RowVersion desc
然后你的第一行包含最大值
试试这个
$byteArray.Add([System.Text.Encoding]::ASCII.GetString($row.Item("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 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
但是我得到一个错误:
ERROR: Error: Cannot compare "System.Byte[]" because it is not IComparable
然后我尝试转换为 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 ERROR: Error: Value was either too large or too small for >an Int32..
有什么方法可以解决吗?
将二进制转换为 int32 返回 0
binary(8)
在 PowerShell 中应表示为 [byte[]]
,因此您有一个字节数组的 ArrayList。在 .Net Framework 中没有内置方法可以将字节数组与其他字节数组进行排序。该行为未定义,因此您必须定义它或以其他方式定义算法。
假设第一个字节是最重要的,第二个是次重要的,依此类推,您应该可以通过执行以下操作来获得 "maximum" 它:
$byteArray | Sort-Object -Property {$_[0]},{$_[1]},{$_[2]},{$_[3]},{$_[4]},{$_[5]},{$_[6]},{$_[7]} -Descending | Select-Object -First 1
这只查看前 8 个字节,但是,如果基类型确实是 binary(8)
,则字段中只有 8 个字节。
如果这不起作用,则您必须遍历 ArrayList 并通过比较字节并保存最大值来自行找到最大值。
如果你只想要最大值,你可以使用 sql :
Select col1,col2,col3, RowVersion from table order by RowVersion desc
然后你的第一行包含最大值
试试这个
$byteArray.Add([System.Text.Encoding]::ASCII.GetString($row.Item("RowVersion")))