2016-03-03 3 views
0

Мы не можем импортировать строку, содержащую CSV с помощью регулируемого привода:PowerShell: параметры переадресации на Commandlet

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, но это не то, что я прошу.

ответ

1

Этого ответ (и вопрос) о параметрах экспедиторских, а не о 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; 
} 

Ссылки:

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 *' :). Вы можете получить список vergs, используя 'Get-Verb'. Надеюсь, это поможет! Во всяком случае, вы должны взглянуть на аргументы о том, что нужно. это очень мощная функция POwerShell при работе с логикой аргументов. –

+0

Спасибо, есть множество особенностей PowerShell, которые я не знаю :) –

Смежные вопросы