Powershell 5 : Cannot convert value To System. 字符串

标签 powershell powershell-5.0

我有一个 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]
  • 传递数组 [2] 而不是单个值。

  • 如果您传递任何其他类型的值,它会自动转换为字符串。
    鉴于您收到的错误消息,后者一定是问题所在,如下所示:
    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/

    相关文章:

    windows - 如何在 Appveyor 中安装 GHC 并将 GHC 放在路径中?

    powershell - 尝试在 Powershell 中登录 Azure

    powershell - 是否可以通过参数绑定(bind)使别名成为全局的?

    powershell - 无法在PowerShell函数中运行[System .__ ComObject] .InvokeMember

    windows - 在 Windows 10 中使用 powershell 在多个桌面上启动程序

    powershell - 重命名时跳过具有给定前缀的文件

    powershell - Remove-PSDrive 不会删除映射的驱动器

    python - PowerShell中的virtualenv?

    powershell - "OutOfMemoryException"对 60Gb 文件使用压缩归档时

    powershell - 如何检查密码复杂性?