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
}
答案 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,..."
并在一个引用的字符串中使用每个人都熟悉的逗号。