PowerShell 似乎在算术运算和转换后执行边界检查。例如,以下操作失败:
[byte]$a = 255
$a++
$a = [byte]256
有没有办法强制溢出或类型转换,而无需通过模数或 C# 和 Add-Type 进行手动计算?
您在 PowerShell 中想要的行为是可以实现的,不过,这有点麻烦;也许还有更好的方法。
如果您只是想要加密功能,那么值得一提的是,BCL 中已经内置了大量加密功能,并且可以从 PowerShell 完全访问它(MD5、SHA、RSA、X509,还有大量其他内容)。
但是,如果您执意要在 PowerShell 中执行未经检查的算术,那么这个 hack 应该可以满足您的需求(基本上我们正在嵌入 C# 代码,并使用未经检查的关键字):
$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;
Usage:
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
Of Note:
- 我们正在打电话
[Helpers.Convert]::To...
and not [System.Convert]::To...
.
- 如果您需要其他方法,则需要将实际的 C# 方法插入到
$members
代码顶部的块。
- 如果你跑
Add-Type
同一件事连续多次Namespace
and Name
组合,在同一个PowerShell会话中,会失败;您将保留之前注册的类型。 - 我已经添加-ErrorAction SilentlyContinue
忽略这个特定场景。 -- 这样,您可以将此代码转储到 .ps1 脚本中,并在每次使用它们的方法之前调用它,并且它们将始终存在。 -- 但是如果您正在修改 C# 代码并重新测试,您将需要在每次更改后更改类型名称;有点痛苦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)