2016-03-03 70 views
0

使用变速驱动我们无法导入包含CSV字符串:PowerShell的:转发参数命令行

Import-Csv Variable:\myCsvVariable 

所以我写了一个简单的功能,做同样的事情:

Function Import-CsvString { 
    param(
     [Parameter(Mandatory=$true,ValueFromPipeline=$true)][string[]]$CsvContent, 
     [char]$Delimiter 
    ) 

    if ($input) { 
     $CsvContent = $input; 
    } 

    $temp = [System.IO.Path]::GetTempFileName() 

    ($CsvContent | Out-String) | Set-Content -Path $temp; 

    $m = Import-Csv -Path $temp -Delimiter $Delimiter 

    Remove-Item $temp -Force 

    $m; 
} 

是否有可能将非指定的Delimiter传递给Import-Csv(或任何其他命令)?

我知道,你可以很容易地在Delimiter是否不为空做一个if...then...else,并调用Import-Csv带或不带Delimiter,但是这不是我问。

回答

1

这个答案(和问题)是关于转发参数,不是CSV 。

我查看了“splatting”,并且有一种将所有传入参数(包含在自动变量$PSBoundParameters中)传递给另一个commandlet的方法。

我们先添加Path参数,并删除CsvContent说法:

Function Import-CsvString { 
    param(
     [Parameter(Mandatory=$true,ValueFromPipeline=$true)][string[]]$CsvContent, 
     [char]$Delimiter 
    ) 

    if ($input) { 
     $CsvContent = $input; 
    } 

    $temp = [System.IO.Path]::GetTempFileName() 

    ($CsvContent | Out-String) | Set-Content -Path $temp; 

    $args = $PSBoundParameters + @{ Path = $temp }; 
    $args.Remove('CsvContent'); 

    $m = Import-Csv @args 

    Remove-Item $temp -Force 

    $m; 
} 

参考文献:

2

我想你想要做的是从csv字符串转换。下面是一个示例:

$csv = "X,Y,Foo 
10,20,super 
30,40,simple" 

ConvertFrom-Csv $csv 

将输出

X Y Foo 
- - --- 
10 20 super 
30 40 simple 

您不必乱用临时文件

+0

谢谢。 PowerShell中有很多动词,我不知道这个。我想下次我会做'get-command | ? {$ _。Name -match'。* csv。*}'在重新发明轮子之前。 –

+0

你可以简单地调用'gcm * csv *':)。你可以使用'Get-Verb'获得一个vergs列表。希望有所帮助!无论如何,你应该看看splatting的论点。这是处理参数逻辑时POwerShell的一个非常强大的功能。 –

+0

谢谢,有很多PowerShell的功能我不知道:) –