繁体   English   中英

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

[英]PowerShell: Input Parameter [Array] element automatically/incorrectly converts to wrong datatype

PowerShell会自动假定值“ 9e9(在下面的COMMAND中)是一个整数; 因为该值没有用引号引起来。

我正在寻找一种任何巧妙的方式来将所有数组元素/值都视为字符串(无论如何),或者强制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

}

PowerShell会自动假定值“ 9e9”(在下面的COMMAND中)是整数; 因为该值没有用引号引起来。

诚然,这让我有点讨厌“责备我喜欢的工具”的措辞。 '假定':“足够傲慢或无礼以致无法做某事”

语言规范 (第2.3.5.12节实数文字)中,“数字e数字”是一种写实数([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以一个数字开头,但不是一个数字,则它将失败, 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,..." 

并在每个引号中使用了大家都熟悉的逗号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM