PowerShell:输入参数[Array]元素自动/错误地转换为错误的数据类型

时间:2017-09-28 18:19:25

标签: arrays powershell types

PowerShell会自动设定值' 9e9 ' (在下面的命令中)是一个整数;因为该值不被引号包围。

我正在寻找任何一种聪明的方法来将所有数组元素/值视为字符串(无论如何)或强制PowerShell使用' 中间的字符,字符串...或者,在其自动转换为整数之前的任何其他可能方式不必用引号包围值。

命令:

Get-Input -var 9e9, ba7


CODE:

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

}

1 个答案:

答案 0 :(得分:1)

  

PowerShell自动假设值'9e9'(在下面的COMMAND中)是一个整数;因为该值未被引号括起来。

不可否认,这让我对'责备我喜欢的工具'的措辞感到有些恼火; '假设':“傲慢或无礼,无法做某事”

language spec(第2.3.5.12节真实文字)中,“数字电子数字”是一种写实数的方式([双])。

那不是PowerShell 假定任何东西,你告诉它通过使用“this is a number”语法而不是“this is a string”来解释它“语法(引用)。

反正。

  

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

     

之前它会自动转换为整数而不必用引号括住该值。

数组值是9000000000,如果你可以强制它成为一个字符串,那么字符串将是"9000000000" - 即在那时,将它改回来已经太晚了。

1/2表示0.5的方式相同,您无法将0.5转换为字符串,并期望将1/2退出。

它不会被转换为数字, 是PowerShell语言中的数字。

这听起来有点像我在重复相同的观点,但这次的重要性在于你在函数中做的任何事情,例如将参数类型设置为[string[]]为时已晚,无法发挥作用,数组已经有了不希望的解释。任何干预都必须尽快发生。

  

强制PowerShell处理中间带有'e'字符的任何值,作为字符串...或任何其他可能的方式

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

它命中' - '并开始读取操作符或参数,将'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,..." 

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