数组帮助在Powershell -正确的语法

本文关键字:语法 帮助 Powershell 数组 | 更新日期: 2023-09-27 17:51:21

我正在编写一个小测试脚本来正确验证一些数据。我有数据通过串口传递到我的程序,所有的数据都在十六进制字符串的。我的代码看起来很乱,但它可以工作。

我让这段代码工作了(尽管看起来很糟糕!),它最终显示了正确格式化的信息,但我有一种感觉,有一种更有效的方法来解析数据。

下面是我调用它的集群行-它将我的原始字符串放入数组,然后只使用属于数据的字节,(其他字节是对校验和/头和控制序列的响应),所以我剥离这些,然后从十六进制转换为十进制到ascii。也许这是一种更有效的方法?

$vin = $b[6,10,11,12,13,17,18,19,20,24,25,26,27,31,32,33,34] |
    ForEach-Object { [Convert]::ToInt32($_,16) } |
    ForEach-Object { [Convert]::ToChar($_) } |
    ForEach-Object { Write-Host $_ -NoNewLine }

这是我从设备(示例消息)获得的原始数据:

49 02 01 00 00 00 4B 49 02 02 4C 31 54 44 49 02 03 35 32 36 33 49 02 0204 35 42 34 37 49 02 05 35 38 38 36

(流是5个7byte的消息,前3个字节是报头字节)

上面的代码将其转换为人类可读的字段:KL1TD52635B475886

我使用类似的数组来解析来自我的设备的响应消息,只是想确保我没有造成混乱!谢谢你!

我可以提供更多的代码,但我的问题是关于数组/解析的使用。

谢谢!

数组帮助在Powershell -正确的语法

唯一看起来不对的是你似乎想要将结果字符串存储在变量($vin)中,但Write-Host只会在屏幕上输出它。

如果你打算重复使用它,你也可以把它变成一个函数:

function ConvertFrom-DeviceHexData {
    param(  
        [Parameter(
            Position=0, 
            Mandatory=$true, 
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true)
        ]
        [String]$inputString
    )
    $inputArray = $inputString.Split(" ")
    $outputArray = $inputArray[6,10,11,12,13,17,18,19,20,24,25,26,27,31,32,33,34] |
        ForEach-Object { [Convert]::ToInt32($_,16) } |
        ForEach-Object { [Convert]::ToChar($_) } |
        ForEach-Object { $_ }
    $outputString = $outputArray -join ""
    $outputString
}

"49 02 01 00 00 00 4B 49 02 02 4C 31 54 44 49 02 03 35 32 36 33 49 02 04 35 42 34 37 49 02 05 35 38 38 36" | ConvertFrom-DeviceHexData返回KL1TD52635B475886

不能说太多关于看似"庞大"的语法和字符串操作,但你的代码看起来相当干净。