powershell 用错误陷阱将字符串转换为字节数组

lnlaulya  于 2023-05-17  发布在  Shell
关注(0)|答案(1)|浏览(165)

给定一个字符串,如0x33,0x32,0xff,我想转换为一个字节数组,这样我就可以写入Registry属性的Reg_Binary类型。我有这个

$string = '0x33,0x32,0xff'
$array = $string -split ','
[byte[]]$hex = [byte[]]$array
$hex.GetType()

它在字符串有效时起作用,也在字符串是垃圾字符串(如0x33,0x32,0xzz)时起作用。我真的希望[byte[]]$array抛出一个异常,我想知道为什么它没有?还有,有没有一种优雅的方法来测试字符串或数组?或者我需要自己验证数组中的每一项,也许是用RegEx?我确实可以控制字符串的格式,但是考虑到Reg_Binary在RegEdit中的外观,我认为这种格式是一个不错的选择,很容易(希望)根据注册表中实际找到的内容创建,同时也使格式非常清楚地不是一个简单的字符串。但是如果有一个更好的解决方案来解决整个问题,那就是使用不同的字符串格式,我洗耳恭听。
编辑:有趣的是,我确实得到了一个[byte[]](0x33,0x32,0xzz)的异常,所以问题似乎是当我转换字符串时,无论是否在括号中,它都不会抛出错误。我觉得这是一个“Powershell试图提供帮助,把一切都搞砸了”的时刻。

wgx48brx

wgx48brx1#

  • 如果任何以,分隔的标记无法转换为[byte]值,则代码确实会触发语句终止错误。
  • 如果没有,则意味着$ErrorActionPreference = 'SilentlyContinue'有效,或者有一个try/catchtrap处理程序可以忽略错误。

无论哪种方式,您都可以使用try/catch语句来捕获错误,错误消息将指出不能强制转换为[byte]的(第一个)令牌:

try {
  # Note: No strict need to also have a [byte[]] cast on the RHS.
  [byte[]] $byteArray = '0x33,0x32,0xzz' -split ','
}
catch {
  # Sample error handling.
  Write-Warning $_
}

输出:

WARNING: Cannot convert value "0xzz" to type "System.Byte". Error:
         "Could not find any recognizable digits."

相关问题