我们无法使用变量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
,但这不是我的意思问。
答案 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;
}
<强>参考文献:强>