Powershell 如何将字符串值强制转换为正确的类型

Powershell 如何将字符串值强制转换为正确的类型,powershell,Powershell,我有一个函数foo,我想以以下格式传递参数列表: foo -ArgumentList "a=1", "b=hello", "c=15.00" 我需要知道每个=后面的值是否是int、string或double(float) 这是我的密码: Function foo { Param( [ValidateScript({ $_ -match ".*=.*" })] [string[]]$ArgumentList ) foreach

我有一个函数
foo
,我想以以下格式传递参数列表:

foo -ArgumentList "a=1", "b=hello", "c=15.00"
我需要知道每个
=
后面的值是否是
int
string
double(float)

这是我的密码:

Function foo {

    Param(
        [ValidateScript({ $_ -match ".*=.*" })]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) {

        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if ($ParamValue -is [string]) {
            "2049" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [int]) {
            "2050" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [double]) {
            "2051" + $ParamName + $ParamValue
        } 
        else {
            Write-Host "Not a string, int or float."
        }
    } 
}
但是,值始终是字符串,这是有意义的,因为它是从字符串读取的

我能把它转换成正确的类型吗

我知道我可以做这样的事情,但是这并不可靠,因为例如
1
可以是一切

PS C:\Users\s> "1" -as [int]
1
PS C:\Users\s> "1" -as [double]
1
PS C:\Users\s> "1" -as [string]
1

您可以像这样使用
-as
测试有限的类型-

$val='23.00'#要进行类型转换的输入值
$intVal=$val-as[int]
$floatVal=$val-as[float]
如果($null-ne$floatVal-和$intVal-ne$floatVal){
$val=$floatVal#值为浮点类型
}elseif($null-ne$intVal){
$val=$intVal#值为int类型
}否则{
写入输出“$val已经是字符串类型”#值不是float或int,所以将其用作字符串
}

我刚刚在函数中添加了一些带有类型转换的if语句

Function foo {

    Param(
        [ValidateScript({ $_ -match ".*=.*" })]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) {

        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if($ParamName -eq "a"){
            $ParamValue = [int]$ParamValue
        }

        if($ParamName -eq "b"){
            $ParamValue = [string]$ParamValue
        }

        if($ParamName -eq "c"){
            $ParamValue = [double]$ParamValue
        }



        if ($ParamValue -is [string]) {
            "2049" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [int]) {
            "2050" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [double]) {
            "2051" + $ParamName + $ParamValue
        } 
        else {
            Write-Host "Not a string, int or float."
        }
    } 
}
[string]$a= "string"
[int]$b = 1
[array]$array = $a,$b
$array | Get-Member

正如您所确认的,当您将值传递给参数时,您正在将类型设置为字符串,它应始终作为字符串进行计算

如果将参数设置为数组,则函数可能会工作。 下面的示例中,Get成员显示了数组中对象的类型

如何获取参数的值?在将格式传递给函数之前,最好先更改格式

Function foo {

    Param(
        [ValidateScript({ $_ -match ".*=.*" })]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) {

        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if($ParamName -eq "a"){
            $ParamValue = [int]$ParamValue
        }

        if($ParamName -eq "b"){
            $ParamValue = [string]$ParamValue
        }

        if($ParamName -eq "c"){
            $ParamValue = [double]$ParamValue
        }



        if ($ParamValue -is [string]) {
            "2049" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [int]) {
            "2050" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [double]) {
            "2051" + $ParamName + $ParamValue
        } 
        else {
            Write-Host "Not a string, int or float."
        }
    } 
}
[string]$a= "string"
[int]$b = 1
[array]$array = $a,$b
$array | Get-Member

我将只使用值类型的
TryParse(string,[ref]var)
方法

Function foo {

    Param(
        [ValidateScript({ $_ -match ".*=.*" })]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) {

        $temp = $null
        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if ([int]::TryParse($ParamValue,[ref]$temp)) {
            $ParamValue = $temp
            "2049" + $ParamName + $ParamValue
            $ParamValue.GetType().FullName
        } 
        elseif ([double]::TryParse($ParamValue,[ref]$temp)) {
            $ParamValue = $temp
            "2050" + $ParamName + $ParamValue
            $ParamValue.GetType().FullName
        } 
        elseif ($ParamValue -is [string]) {
            "2051" + $ParamName + $ParamValue
            $ParamValue.GetType().FullName
        } 
        else {
            Write-Host "Not a string, int or float."
        }
    } 
}
我添加了
$ParamValue.GetType().FullName
,以便您可以看到正在设置的类型。
[type]::TryParse(string,[ref]$temp)
方法将尝试将字符串强制转换为该类型。它将返回
True
False
,并将相应的值存储到
$temp
False
将在我们的测试用例中,
$temp
中产生一个
0
值。如果
True
$temp
将包含强制转换值


注意:您必须意识到,一旦引入字符串串联(
“2048”+somevalue
),该表达式的输出就是一个
字符串

,谢谢,但参数名称只是示例,我将来不会知道它们的名称,因此我无法完美地使用它。谢谢我知道它最终会变成一个字符串,它必须是一个前面有正确数字的字符串:-)。