如何使用管道获取符合标准的信息,同时比较十六进制数
how use pipeline to get info meeting criteria, but also comparing hex numbers
我有一个管道,用于从 excel 电子表格中获取其他设备型号的信息,但对于此设备型号,该值为十六进制,十六进制不常见,因为 0x10 = 0x00010,所以我需要在管道中比较这些值。
这是我在返回电子表格内容后用于非十六进制值的管道:
$deviceErrDescMap = Process_ErrorDescMap -errorCodeListFilePath $errorCodeListFile #excel is returned
$deviceErrDescRow = $deviceErrDescMap | Where-Object 'Value' -eq $sdkNum
在此,$deviceErrDescMap 持有如下电子表格值:
Name Value Description
A 0x00000010 Check Material A
B 0x00000100 Check Interlock
C 0x00000020 Check Material C
这就是我获取 excel 内容的方式,以防万一:
Function Process_ErrorDescMap{
[cmdletbinding()]
Param ([string]$errorCodeListFilePath)
Process
{
if(Test-Path $errorCodeListFilePath)
{
#Excel method
#Install-Module -Name ImportExcel -Scope CurrentUser -Force (dependency - 1. Close all instances of PowerShell (console, ISE, VSCode), 2. Move the PackageManagement folder from OneDrive, 3. Open a PowerShell Console (Run As Administrator), 4. Run Install-Module ImportExcel)
if(($errorCodeListFilePath -match "DeviceA") -or ($errorCodeListFilePath -match "DeviceB"))
{
$startRow = 1
}
else
{
$startRow = 2
}
$importedExcel = Import-Excel -Path $errorCodeListFilePath -StartRow $startRow
return $importedExcel #list of error desc
}
else {
Write-Host "Invalid path given: $($errorCodeListFilePath)"
return "***Invalid Path $($errorCodeListFilePath)"
}
} #end Process
}# End of Function Process_ErrorDescMap
电子表格的第一行,值为 0x00000010,应与 $sdkNum=0x10 进行比较,这是第一行。因此 0x10(或 0x010)需要匹配或等于此电子表格值 0x0000010 并从地图中获取它。对于如何实现这一点,我有点不知所措。我不确定如何将 'Value' 转换为十六进制,并将其与此管道中 $sdkNum 的十六进制值进行比较。我正在考虑使用正则表达式从 $sdkNum 中获取 10,并使用匹配从电子表格内容中获取包含 10 的任何行,然后进一步比较。我觉得有一种更简单的方法,而且我不确定如何从十六进制字符串中得到非零数字和它右边的 0。
如果您对这种十六进制比较感到困惑,请随意使用十六进制到十进制的转换网页,您会看到 0x10 = 0x000010。我也觉得很奇怪。重要的是 1 之后的 0。
这是 PowerShell 5.1 和 VSCode。
当您将字符串转换为整数类型时,PowerShell 将本机解析有效的十六进制数字:
PS ~> [int]'0x10'
16
由于 PowerShell 的所有重载比较运算符 (-eq
/-ne
/-gt
/-ge
/-lt
/-le
) 自动将 right-hand 侧操作数转换为 left-hand 侧操作数的类型,您需要做的就是确保您作为第一个操作数提供的表达式已经是 [int]
:
$sdkNum = 0x10 # notice no quotation marks
# Option 1: cast the hex string to `[int]` explicitly
... |Where-Object { [int]$_.Value -eq $sdkNum }
# Option 2: $sdkNum is already an [int], PowerShell automatically converts hex string to int
... |Where-Object { $sdkNum -eq $_.Value }
我有一个管道,用于从 excel 电子表格中获取其他设备型号的信息,但对于此设备型号,该值为十六进制,十六进制不常见,因为 0x10 = 0x00010,所以我需要在管道中比较这些值。
这是我在返回电子表格内容后用于非十六进制值的管道:
$deviceErrDescMap = Process_ErrorDescMap -errorCodeListFilePath $errorCodeListFile #excel is returned
$deviceErrDescRow = $deviceErrDescMap | Where-Object 'Value' -eq $sdkNum
在此,$deviceErrDescMap 持有如下电子表格值:
Name Value Description
A 0x00000010 Check Material A
B 0x00000100 Check Interlock
C 0x00000020 Check Material C
这就是我获取 excel 内容的方式,以防万一:
Function Process_ErrorDescMap{
[cmdletbinding()]
Param ([string]$errorCodeListFilePath)
Process
{
if(Test-Path $errorCodeListFilePath)
{
#Excel method
#Install-Module -Name ImportExcel -Scope CurrentUser -Force (dependency - 1. Close all instances of PowerShell (console, ISE, VSCode), 2. Move the PackageManagement folder from OneDrive, 3. Open a PowerShell Console (Run As Administrator), 4. Run Install-Module ImportExcel)
if(($errorCodeListFilePath -match "DeviceA") -or ($errorCodeListFilePath -match "DeviceB"))
{
$startRow = 1
}
else
{
$startRow = 2
}
$importedExcel = Import-Excel -Path $errorCodeListFilePath -StartRow $startRow
return $importedExcel #list of error desc
}
else {
Write-Host "Invalid path given: $($errorCodeListFilePath)"
return "***Invalid Path $($errorCodeListFilePath)"
}
} #end Process
}# End of Function Process_ErrorDescMap
电子表格的第一行,值为 0x00000010,应与 $sdkNum=0x10 进行比较,这是第一行。因此 0x10(或 0x010)需要匹配或等于此电子表格值 0x0000010 并从地图中获取它。对于如何实现这一点,我有点不知所措。我不确定如何将 'Value' 转换为十六进制,并将其与此管道中 $sdkNum 的十六进制值进行比较。我正在考虑使用正则表达式从 $sdkNum 中获取 10,并使用匹配从电子表格内容中获取包含 10 的任何行,然后进一步比较。我觉得有一种更简单的方法,而且我不确定如何从十六进制字符串中得到非零数字和它右边的 0。
如果您对这种十六进制比较感到困惑,请随意使用十六进制到十进制的转换网页,您会看到 0x10 = 0x000010。我也觉得很奇怪。重要的是 1 之后的 0。
这是 PowerShell 5.1 和 VSCode。
当您将字符串转换为整数类型时,PowerShell 将本机解析有效的十六进制数字:
PS ~> [int]'0x10'
16
由于 PowerShell 的所有重载比较运算符 (-eq
/-ne
/-gt
/-ge
/-lt
/-le
) 自动将 right-hand 侧操作数转换为 left-hand 侧操作数的类型,您需要做的就是确保您作为第一个操作数提供的表达式已经是 [int]
:
$sdkNum = 0x10 # notice no quotation marks
# Option 1: cast the hex string to `[int]` explicitly
... |Where-Object { [int]$_.Value -eq $sdkNum }
# Option 2: $sdkNum is already an [int], PowerShell automatically converts hex string to int
... |Where-Object { $sdkNum -eq $_.Value }