【问题标题】:PowerShell: Input Parameter [Array] element automatically/incorrectly converts to wrong datatypePowerShell:输入参数 [Array] 元素自动/错误地转换为错误的数据类型
【发布时间】:2017-09-28 18:19:24
【问题描述】:

PowerShell 自动假定值 '9e9' (在下面的命令中) 是整数;因为该值没有被引号包围。

我正在寻找任何巧妙的方法来将所有数组元素/值视为字符串(无论如何)或强制 PowerShell 处理中间带有 'e' 字符的任何值,作为一个字符串...或者,在其自动转换为整数之前的任何其他可能的方式不必用引号将值括起来

命令:

Get-Input -var 9e9, ba7


代码:

function Get-Input {

    [CmdletBinding()]
    param(
        [array[]]$Vars
    )

    $Var = $Vars[0]

    write-output $Var
}

**** 更新 ****

TessellatingHeckler 在他的答案末尾有最好的解决方案。我只是对去除空格做了一个小的修改。我仍然认为这都是 PowerShell 的错。 j/k。我真的很感谢 TessellatingHeckler 有时间把它分解并仍然提供一个明智的解决方案。感谢 TessellatingHeckler!

命令:

Get-Input -vars "9e9, ba7"


新代码:

function Get-Input {

    [CmdletBinding()]
    param(
        [string[]]$Vars
    )

    $Vars = $Vars.replace(' ', "")
    $Vars = $Vars.split(",")

    $Var = $Vars[0]

    write-output $Var

}

【问题讨论】:

  • 声明 [String[]] 而不是 [array[]]

标签: arrays powershell types


【解决方案1】:

PowerShell 自动假定值“9e9”(在下面的命令中)是一个整数;因为该值没有被引号包围。

诚然,这让我对“责备我喜欢的工具”的措辞有些恼火; 'Presume':“傲慢或无礼地做某事”

language spec(第 2.3.5.12 节 Real Literals)中,“number e number”是一种写实数([double])的方式。

这不是 PowerShell 假设任何东西,你告诉它通过使用“这是一个数字”语法而不是“这是一个字符串”来解释它" 语法(引号)。

无论如何。

我正在寻找任何巧妙的方法来将所有数组元素/值视为字符串(无论如何)[..]

在它被自动转换为整数之前,不必用引号将值括起来。

数组值是 9000000000,如果你可以强制它是一个字符串,那么这个字符串就是"9000000000"——也就是说,到那时,再改回来已经太晚了。

1/2 表示0.5 的方式相同,您不能将0.5 转换为字符串并期望得到1/2。

它没有被转换为数字,它 PowerShell 语言中的数字。

这听起来有点像我在重复同一点,但这次的意义在于,你在函数中所做的任何事情,例如将参数类型设置为[string[]] 都来不及了,数组已经有不受欢迎的解释。任何干预都必须尽早进行。

强制 PowerShell 将任何中间带有“e”字符的值视为字符串...或任何其他可能的方式

当它扫描Get-Input -var 9e9, ba7 时,它会读取一个用于“Get-Input”的 GenericToken,它将变成一个命令。

它点击“-”并开始读取运算符或参数,将“var”读取到空格并且不匹配运算符(“-eq”、“-gt”等),因此将其视为范围。

它读取“9”并开始读取一个数字。

只有两种方法可以解决这个问题 - 如果数字有效,则将其读取为数字。现在发生了这种情况,而您不想这样做。

如果号码无效,例如7z.exe 以数字开头,但不是数字,然后失败,回溯,并将其视为参数的 GenericToken。

所以你可以添加其他东西来强制它成为一个字符串9e9z。但是你不能写 '9e9' 让它变成一个没有引号的字符串。

您唯一能做的就是使用其他东西作为分隔符(不是逗号),这将强制整个参数为一个字符串 - 这也意味着没有空格 - 然后自己将其拆分为函数内的文本片段.

function Get-Input {

    [CmdletBinding()]
    param(
        [string]$VarsText
    )

    $Vars = $VarsText.Split('.')

    $Var = $Vars[0]
    write-output $Var
}

Get-Input 9e9.bab

这只会让每个人感到困惑,如果你这样做可能会更有帮助

Get-Input "9e9,bab,..." 

并在一个带引号的字符串中使用了每个人都熟悉的逗号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多