如何使用管道获取符合标准的信息,同时比较十六进制数

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 }