gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:28:04 24 4
gpt4 key购买 nike

我有一个 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 ToSystem.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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com