我有一个 PS 脚本,我用它逐行读取一个 csv 文件到一个变量中:
CSV :
header1;header2
column1;column2
PS脚本:#-------------------------
# Func declarations
#-------------------------
function myFunc{
param(
[Parameter(Mandatory=$true)][string]$param1,
[Parameter(Mandatory=$true)][string]$param2
)
#Do something
}
#-------------------------
# Run
#-------------------------
$lines = Import-Csv .\etc\file.csv -Delimiter ";" -Header "header1","header2"
foreach($line in $lines) {
myFunc -param1 $line.header1 -param2 $line.header1
}
电话myFunc -param1 $line.header1
抛出一个:Cannot convert value To System.String (...) ParameterBindingArgumentTransformationException
使用
$line.header1.GetType()
检查 $line.header1(或 $line.header2)的类型按预期返回 System.string
.第一个定义如下:
[Parameter(Mandatory=$true)]$param1
,第一个被识别但第二个是空的...
为什么?
最佳答案
注意:在撰写本文时,问题中描述的具体症状没有任何解释,Sandy 报告他们的问题现已解决。
这个答案通常解释了在什么情况下你会看到Cannot convert value to type System.String
将参数传递给 [string]
时出错-typed 参数 .
使用您的示例函数,这得益于使用 [Parameter()]
属性隐式为 advanced function ,只有两种方法可以将值传递给您的 [string]
-typed 参数可能会失败:
$null
或空字符串(例如 ''
或 ""
)[1]如果您传递任何其他类型的值,它会自动转换为字符串。
鉴于您收到的错误消息,后者一定是问题所在,如下所示:
function myFunc {
param(
[Parameter(Mandatory)] # NOTE: This makes the function an *advanced* function.
[string] $param1
)
"[$param1]"
}
# FAILS, because an *array* can't be passed as a *single string*
# to an *advanced* function's [string] parameter.
myFunc -param1 'one', 'two'
这会产生以下错误:Cannot process argument transformation on parameter 'param1'.
Cannot convert value to type System.String
无法将数组传递给 [string]
参数仅适用于高级功能 (通过 [Parameter()
属性使函数隐式成为高级函数的显式替代方法是在 [CmdletBinding()]
块上方放置一个 param(...)
属性)。一个简单(非高级)函数确实接受一个数组作为
[string]
参数 , 并在转换时简单地将数组元素与空格 [3] 连接起来;例如。,'one', 'two'
变成 'one two'
注意:可以说,将数组传递给 [string]
参数应始终要求调用者采取深思熟虑的操作——既要确认传递数组的实际意图,又要控制它的字符串化方式——因此高级函数的行为是更明智的行为(除非不始终如一地应用)到一般收藏)。然而,鉴于 PowerShell 对向后兼容性的 promise ,非高级函数的行为不太可能改变。
[1] 允许这些值的唯一方法是通过删除
Mandatory=$true
使参数成为非必需的。属性属性(或将其设置为 $false
)。奇怪的是,强制性 [string]
即使故意传递参数,也不接受这些值。[2] 奇怪的是,技术上不是数组的集合(派生自
[System.Array]
/[object[]]
),例如 [System.Collections.ArrayList]
或 [System.Collections.Generic.List[object]]
, 被接受,然后像非高级函数一样被字符串化。[3] 从技术上讲,您可以通过 preference variable
$OFS
控制分隔符(字符串) .
关于Powershell 5 : Cannot convert value To System. 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60600539/