2016-03-03 105 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的功能我不知道:) –