PowerShell:将参数转发到Commandlet

时间:2016-03-03 12:36:44

标签: powershell

我们无法使用变量drive导入包含csv的字符串:

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(或任何其他命令)?

我知道您可以轻松if...then...else查看Delimiter是否为空,并使用或不使用Import-Csv致电Delimiter,但这不是我的意思问。

2 个答案:

答案 0 :(得分:2)

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

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

ConvertFrom-Csv $csv

将输出

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

你不必弄乱临时文件

答案 1 :(得分:2)

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

我看着" splatting"并且有一种方法将所有传入参数(将包含在$PSBoundParameters自动变量中)传递给另一个命令行开关。

我们首先添加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;
}

<强>参考文献: