无法对参数进行参数转换

时间:2014-11-24 01:23:57

标签: powershell arguments

我声明了一个元组数组如下:

 [System.Tuple[string,string][]] $files = @()

我有以下工作流程:

Workflow Perform-Download
{
    Param (
        [Parameter(Mandatory = $true)]
        [System.Tuple[string,string][]] $Files
    )
    ForEach -Parallel ($file in $Files)
    {
        Parallel{Save-File -Url $file.Item1 -DestinationFolder $file.Item2}
    }
}

我正在尝试执行以下操作:

Perform-Download -Files $files

但是我收到以下错误:

Perform-Download : Cannot process argument transformation on parameter 'Files'. Cannot convert the 
"System.Tuple`2[System.String,System.String][]" value of type "System.Tuple`2[[System.String, mscorlib, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089]][]" to type "System.Tuple".
At line:1 char:26
+ Perform-Download -Files $files
+                          ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Perform-Download], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Perform-Download

我做错了什么?

2 个答案:

答案 0 :(得分:2)

利用What What Be Cool所写的内容,我尝试了以下内容。基本上$Files作为[array]传递,然后它被转换为元组。 我创建了一个虚拟Save-File,它只将参数写入输出。

我不确定为什么Tuple不能直接作为参数传递,你可能发现了一个错误。

$files = @([System.Tuple]::Create("Flinstone","Rubble"), [System.Tuple]::Create("Simpsons","Flanders"))
function Save-File 
{
    Param ($URL, $DestinationFolder)
    Write-output ("{0} {1}" -f $URL, $DestinationFolder)    
}
Workflow Perform-Download
{
    Param (
    [Parameter(Mandatory = $true)]
    [array] $Files
    )

    $Files = [System.Tuple[string,string][]] $Files
    ForEach -Parallel ($file in $Files)
    {
        Parallel{Save-File -Url $file.Item1 -DestinationFolder $file.Item2}
    }
}

Perform-Download -Files $files

答案 1 :(得分:0)

这是一个简单的脚本:

param([System.Tuple[string,string][]]$files)

foreach ($file in $files) {
    [console]::WriteLine("Item1: {0}, Item2: {1}", $file.Item1, $file.Item2)
}

然后设置数据并调用脚本。

PS C:\data> $fileList = @([System.Tuple]::Create("Flinstone","Rubble"), [System.Tuple]::Create("Simpsons","Flanders"))

PS C:\data> .\soTuple.ps1 -files $fileList
Item1: Flinstone, Item2: Rubble
Item1: Simpsons, Item2: Flanders

请参阅using Tuples in PowerShell

上的这篇文章