如何在Powershell中将字符串转换为UInt64?字符串到数字的转换

2024-05-06

考虑以下 Powershell 片段:

[Uint64] $Memory = 1GB
[string] $MemoryFromString = "1GB"
[Uint64] $ConvertedMemory = [Convert]::ToUInt64($MemoryFromString)

第三行失败并显示:

Exception calling "ToUInt64" with "1" argument(s): "Input string was not in a correct format."
At line:1 char:1
+ [Uint64]$ConvertedMemory = [Convert]::ToUInt64($MemoryFromString)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

如果我检查的内容$Memory:

PS C:\> $Memory
1073741824

效果很好。

那么,如何在 Powershell 中将值“1GB”从字符串转换为 UInt64?


To 补充 肖恩的有用答案 https://stackoverflow.com/a/41088625/45375:

这只是结果变量的类型约束([uint64] $ConvertedMemory= ...) 确保($MemoryFromString / 1)被转换为[uint64] ([System.UInt64]).

表达结果$MemoryFromString / 1实际上是类型[int] ([System.Int32]):

PS> ('1gb' / 1).GetType().FullName
System.Int32

因此,要保证表达式通过它自己返回一个[uint64]例如,你必须使用cast:

PS> ([uint64] ('1gb' / 1)).GetType().FullName
System.Int64

Note the required (...) around the calculation, as the [uint64] cast would otherwise apply to '1gb' only (and therefore fail).
Alternatively, ('1gb' / [uint64] 1) works too.

Note:

  • '1gb' - 0也会起作用的,
  • but not '1gb' * 1'(实际上是无操作)或'1gb' + 0(结果为字符串'1gb0'),因为运营商* and + with a string型LHS执行string操作(分别是复制和串联)。

自动的字符串到数字的转换 and 数字字面量在 PowerShell 中:

当PowerShell执行时隐式数字转换,包括在执行混合数字类型计算和解析源代码中的数字文字时,它方便地自动选择一个“大”足以容纳结果的数字类型.

In 隐式字符串到数字的转换, PowerShell 可以方便地识别与号码支持的格式相同literals在源代码中:

  • number-base prefixes (for integers only): 0x for 十六进制整数,以及0b for binary整数(PowerShell [核心] 7.0+)

  • number-type suffixes: L for [long] ([System.Int64]), and D for [decimal] ([System.Decimal]); e.g., '1L' - 0 yields a [long].
    Note that C# uses M instead of D and instead uses D to designate [System.Double]; also, C# supports several additional suffixes.

    • PowerShell [核心] 6.2+现在支持附加后缀: Y ([sbyte]), UY ([byte]), S ([int16]), US ([uint16]), U ([uint32] or [uint64],按需),以及UL ([uint64]).

    • PowerShell [核心] 7.0+另外还支持后缀n ([bigint])

    • 您可以通过官方帮助主题关注未来的发展(如果有),about_数字_文字 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_numeric_literals.

  • 浮点表示如1.23 (decimal仅有的);注意PowerShell 只识别.作为小数点,无论当前的文化如何.

  • 指数表示法 (decimal仅有的);例如。,'1.0e3' - 1 yields 999.

  • its own 二进制乘数后缀, kb, mb, gb, tb, pb(对于乘数[math]::pow(2, 10) == 1024, [math]::pow(2, 20) == 1048576,...);例如。,'1kb' - 1 yields 1023;请注意,这些后缀是 PowerShell 特定的,因此 .NET 框架数字解析方法不会not认出他们。

The 数字转换规则很复杂,但这里有一些关键点:

This is based on my own experiments. Do tell me if I'm wrong.
Types are expressed by their PS type accelerators and map onto .NET types as follows:
[int] ... [System.Int32]
[long] ... [System.Int64]
[decimal] ... [System.Decimal]
[float] ... [System.Single]
[double] ... [System.Double]

  • 电源外壳从不自动选择unsigned整数类型.

    • 注:在PowerShell [核心] 6.2+,您可以使用类型后缀US, U or UL(见上文)强制处理为无符号类型(正数);例如。,0xffffffffffffffffU
    • 这对于十六进制来说可能是意想不到的数字字面量; e.g., [uint32] 0xffffffff fails, 因为0xffffffff is first- 隐式 - 转换为signed type [int32],这产生-1,其中,作为signed值,然后不能转换为unsigned type [uint32].
    • Workarounds:
      • Append L强制解释为[int64]首先,这会产生预期的正值4294967295,在这种情况下强制转换为[uint32]成功了。
      • 该技术不适用于上述值0x7fffffffffffffff ([long]::maxvalue),但是,在这种情况下您可以使用string转换:[uint64] '0xffffffffffffffff'
  • 电源外壳widens根据需要的整数类型:

    • For decimal整数文字/字符串,扩大beyond整数类型到[System.Decimal], 进而[Double], 如所须;例如。:

      • (2147483648).GetType().Name yields Int64,因为该值为[int32]::MaxValue + 1,因此被隐式扩展为[int64].

      • (9223372036854775808).GetType().Name yields Decimal,因为该值为[int64]::MaxValue + 1,因此被隐式扩展为[decimal].

      • (79228162514264337593543950336).GetType().Name yields Double,因为该值为[decimal]::MaxValue + 1,因此被隐式扩展为[double].

    • For 十六进制(始终是整数)文字/字符串,加宽停止于[int64]:

      • (0x100000000).gettype().name yields Int64,因为该值为[int32]::MaxValue + 1,因此被隐式扩展为[int64].

      • 0x10000000000000000,即[int64]::MaxValue + 1, does not晋升为[System.Decimal]由于是十六进制并将其解释为数字fails.

    • 注意:上述规则适用于单个文字/字符串,但范围扩大表达式可能会导致扩大到[double]立即(不考虑[decimal]) - 见下文。

  • PowerShell 貌似从不自动选择整数类型smaller than [int]:

    • ('1' - 0).GetType().FullName yields System.Int32 (an [int]),即使整数1适合[int16]甚至[byte].
  • 计算结果永远不会使用比任一操作数更小的类型:

    • Both 1 + [long] 1 and [long] 1 + 1产量a[long](即使结果可以适合更小的类型)。
  • 或许出乎意料的是,PowerShell 自动选择浮点 type [double]对于大于任一操作数类型的计算结果integer类型可以适合,即使结果could适合一个更大的整数 type:

    • ([int]::maxvalue + 1).GetType().FullName yields System.Double (a [double]),即使结果适合[long]整数。
    • 但是,如果其中一个操作数是足够大的整数类型,则结果就是该类型:([int]::maxvalue + [long] 1).GetType().FullName yields System.Int64 (a [long]).
  • 在计算中至少涉及一种浮点类型总是会导致[double],即使与整数类型混合或使用 all-[float]操作数:

    • 1 / 1.0 and 1.0 / 1 and 1 / [float] 1 and [float] 1 / 1 and [float] 1 / [float] 1全部产生 a[double]
  • Number literals在不使用类型后缀的源代码中:

    • Decimal integer文字被解释为以下类型中能够拟合该值的最小者:[int] > [long] > [decimal] > [double](!):

      • 1产生一个[int](就像声明的那样,[int]是最小的自动选择类型)
      • 214748364(1 高于[int]::maxvalue)产生一个[long]
      • 9223372036854775808(1 高于[long]::maxvalue)产生一个[decimal]
      • 79228162514264337593543950336(1 高于[decimal]::maxvalue)产生一个[double]
    • 十六进制 integer文字被解释为以下类型中能够拟合该值的最小者:[int] > [long];也就是说,与decimal文字,类型大于[long]不支持;Caveat: 具有高位设置的值导致negative小数,因为 PowerShell 自动选择signed整数类型:

      • 0x1产生一个[int]

      • 0x80000000产生一个[int]这是一个negative值,因为高位被设置:-2147483648, 哪一个是smallest [int]数,如果考虑符号 ([int]::MinValue)

      • 0x100000000(1 多于可容纳的[int] (or [uint32])) 产生一个[long]

      • 0x10000000000000000(1 多于可容纳的[long] (or [uint64])) breaks, 因为[long]是支持的最大类型(“数字常量无效”)。

      • 确保十六进制文字结果为positive number:

        • Windows PowerShell:使用类型后缀L强制解释为[long]首先,然后(可选)转换为unsigned类型;例如[uint32] 0x80000000L yields 2147483648,但请注意,该技术仅适用于0x7fffffffffffffff, i.e., [long]::maxvalue;如上所述,使用从string作为解决方法(例如,[uint64] '0xffffffffffffffff').

        • PowerShell [核心] 6.2+:使用类型后缀us, u, or ul, 如所须;例如。:0x8000us -> 32768 ([uint16]), 0x80000000u -> 2147483648 ([uint32]), 0x8000000000000000ul -> 9223372036854775808 ([uint64])

    • Binary integer文字 (PowerShell [Core] 7.0+) 的解释方式与十六进制那些;例如。,0b10000000000000000000000000000000 == 0x80000000 == -2147483648 ([int])

    • 浮点 or 指数表示法文字(仅在decimal代表)是总是被解释为[double], 无论多小:

      • 1.0 and 1e0两者都产生[double]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Powershell中将字符串转换为UInt64?字符串到数字的转换 的相关文章

随机推荐

  • 如何从 coxme 包中的 lmekin 对象中提取 p 值

    我希望能够查看 coxme 包生成的 lmekin 对象的 p 值 eg model lmekin formula height score sex age 1 IID data phenotype df varlist kinship m
  • weak_ptr、make_shared 和内存释放

    一个控制块shared ptr当至少有一个时保持存活weak ptr展示 如果共享指针是用以下命令创建的make shared这意味着对象的整个内存都保持分配状态 对象本身被正确破坏 但由于对象的控制块和内存被分配在一个块中 如make s
  • 如何在Python中每次运行脚本时增加变量?

    我有一个 Python 脚本 我想在每次运行时增加一个全局变量 这可能吗 使用外部文件很容易做到这一点 您可以创建一个函数来为您执行此操作 这样您就可以根据需要将多个文件用于多个变量 尽管在这种情况下您可能想要研究某种序列化并将所有内容存储
  • 在 ionic 3 应用程序中找不到命名空间“google”

    在我尝试在项目中使用 google 变量后 任何人都可以帮我解决这个错误 我进入了 ionic 3 应用程序 npm install save types google maps 将以下内容添加到我的 package json 中 type
  • winpdb 不适用于 python 3.3

    我无法让 rpdb2 与 python 3 3 一起运行 但根据多个来源 这应该是可能的 rpdb2 d myscript py A password should be set to secure debugger client serv
  • 是否有中欧通用的 TimeZoneInfo?

    是否有针对中欧的通用 TimeZoneInfo 将 CET 和 CEST 纳入考虑 我有一个应用程序正在执行以下操作 TimeZoneInfo tzi TimeZoneInfo FindSystemTimeZoneById Central
  • 通过pip安装lxml时出错:需要Microsoft Visual C++ 14.0

    我使用的是 Windows 10 机器 最近从 python 2 7 迁移到 3 5 当尝试通过 pip 安装 lxml 时 它会停止并抛出此错误消息 构建 lxml etree 扩展错误 需要 Microsoft Visual C 14
  • 在Python子目录中创建文件?

    在我的 Python 脚本中 我需要在子目录中创建一个新文件而不更改目录 并且需要从当前目录不断编辑该文件 My code os mkdir datetime dst for ip in open list txt with open ip
  • 使用加权概率和值查找数组中的项目

    上周我正在做的一个简单程序遇到了一些问题 这里有人帮助了我 现在我遇到了另一个问题 我目前有这个代码 var findItem function desiredItem var items item rusty nail probabili
  • Mac OS X 文件关联有效,但文件图标未更改

    我使用 Qt 5 3 2 开发了一个 Mac 应用程序 该应用程序处理具有特定扩展名的文件 比方说 xyz 我创建了一个名为 XYZ icns 的图标文件 并将其添加到我的应用程序包资源文件夹中 MyApp app Contents Res
  • 在自动触发的默认侦听器之前触发 Hibernate 自定义事件侦听器

    我创建了一个自定义 Hibernate 事件监听器 扩展了 org hibernate event PreInsertEventListener 自定义侦听器会重写 onPreInsert 方法 并在使用 DAO 将 联系人 实体保存到数据
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • 猪如何过滤不同的对(对)

    我是猪的新手 我有一个 Pig 脚本 它在两个元素之间生成制表符分隔的对 每行一对 例如 John Paul Tom Nik Mark Bill Tom Nik Paul John 我需要过滤掉重复的组合 如果我使用 DISTINCT 我会
  • 如何在列表视图中每行右侧显示 4 个图标

    我想在列表视图的每一行右侧设置 3 个图标 我正在制作购物应用程序 我希望在列表视图中用户选择任何产品时 这样他 她可以以 3 种方式查看产品 就像用户选择图标一样1 这样用户可以在网格视图中看到产品 如果用户选择图标 2 这样用户可以在图
  • Visual Studio 2017 ASP.Net 发布独立的 Dot Net Core 应用程序

    我在 Visual Studio 2017 中有一个 Net Core ASP Net 应用程序 我正在尝试对该应用程序进行独立部署 如果我从 CLI 运行以下命令 它会完全按照我想要的方式工作并生成 exe dotnet publish
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • 使用基于 ConvLSTM2D 的 Keras 模型从较低分辨率图像估计高分辨率图像

    我正在尝试使用以下内容ConvLSTM2D从低分辨率图像序列估计高分辨率图像序列的架构 import numpy as np scipy ndimage matplotlib pyplot as plt from keras models
  • SQLAlchemy 闭包表关系定义

    我最近开始使用 SQL Alchemy 开展一个涉及攀岩区域和路线的项目 区域是分层的 因为单个区域可以包含多个区域 而多个区域又可以包含其他区域 路线直接与单个区域关联 但也与该区域的父区域关联 等等 为了实现这一点 我选择使用Bill
  • 如何配置 Ansible 跳过两个堡垒主机?

    我想编写一个 Ansible 剧本 使用 Ansible 2 7 5 它将在到达目标服务器之前跳过两个主机来执行诸如安装 docker 和 python 等操作 我能够让 Ansible 通过一台主机跳转到server1通过将其添加到我的h
  • 如何在Powershell中将字符串转换为UInt64?字符串到数字的转换

    考虑以下 Powershell 片段 Uint64 Memory 1GB string MemoryFromString 1GB Uint64 ConvertedMemory Convert ToUInt64 MemoryFromStrin