powershell - 如何在 PowerShell 中抑制溢出检查?

标签 powershell integer-overflow unchecked unchecked-conversion

PowerShell 似乎在算术运算和转换后执行边界检查。例如,以下操作失败:

[byte]$a = 255
$a++

$a = [byte]256

有没有办法强制溢出或类型转换,而无需通过模或 C# 和 Add-Type 进行手动计算?

最佳答案

您在 PowerShell 中想要的行为是可以实现的,不过,这有点小技巧;也许有更好的方法。

不过,如果您只想要加密功能,那么值得一提的是,BCL 中已经内置了大量的加密功能,并且可以从 PowerShell(MD5、SHA、RSA、X509,还有很多其他的东西)完全访问它。

但是,如果您对在 PowerShell 中执行未经检查的算术一无所知,那么这是一个应该为您提供所需的技巧(基本上我们正在嵌入 C# 代码,并使用 unchecked 关键字):

$members = @' 
public static UInt32 ToUInt32(int value)
{
    unchecked
    {
        return (UInt32)value;
    }
}


public static byte ToByte(int value)
{
    unchecked
    {
        return (byte)value;
    }
}
'@;

$type = Add-Type -Name "Convert" -Namespace "Helpers" `
        -MemberDefinition $members -PassThru -ErrorAction SilentlyContinue;

用法:
PS C:\Some\Folder> [Helpers.Convert]::ToUInt32(-1);
4294967295

PS C:\Some\Folder> [Helpers.Convert]::ToByte(-1);
255

PS C:\Some\Folder> [Helpers.Convert]::ToByte(256);
0

注:
  • 我们正在调用 [Helpers.Convert]::To...而不是 [System.Convert]::To... .
  • 如果您需要其他方法,则需要将实际的 C# 方法插入到 $members 中。块在代码的顶部。
  • 如果您运行 Add-Type连续多次使用相同的 NamespaceName组合,在同一个PowerShell session 中,会失败;并且您将保留先前注册的类型。 -- 我已添加 -ErrorAction SilentlyContinue忽略这个特定的场景。 -- 这样,您可以将此代码转储到 .ps1 脚本中,并在每次使用它们之前调用它,它们将始终存在。 -- 但是,如果您正在修改 C# 代码并重新测试,您将希望在每次更改后更改类型名称;这有点痛苦。
  • 关于powershell - 如何在 PowerShell 中抑制溢出检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15720138/

    相关文章:

    powershell - 用于 Windows 的 openssl 和用于 PEM 的 powershell PFX

    .net - 使用 PowerShell 从文件夹中获取文件名的最快\最佳方法是什么?

    c++ - 对 C++ 异常处理很困惑

    java - 未经检查的强制转换泛型

    powershell - 新 PSDrive --Persist 不起作用

    .net - 当路径\文件名超过 260 个字符时,在 PowerShell 中获取/设置文件属性

    c# uint 到 ushort 溢出,就像在 native C 中一样

    java - 如何重写以下方法而不出现未经检查的警告?

    java - 为什么 SQLException 是已检查异常