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
),该表达式的输出就是一个字符串
,谢谢,但参数名称只是示例,我将来不会知道它们的名称,因此我无法完美地使用它。谢谢我知道它最终会变成一个字符串,它必须是一个前面有正确数字的字符串:-)。