1

更新:我刚刚发现我运行它的客户端是 PS V1。我不能使用喷溅。

我有一个处理 csv 文件的脚本。我不提前知道文件是否有标题,所以我提示用户输入标题或使用文件中的标题:

$header = Read-Host 'Input your own header?'

我想要做的是能够检查是否已设置标头变量以决定在执行 Import-CSV 命令行开关时是否要使用该标志。

我已经尝试了很多事情:

IF($Header){Import-Csv $File -delimiter $delimiter -Header $header }
ELSE 
{Import-Csv $File -delimiter $delimiter} |

或者

IF($Header){Import-Csv $File -delimiter $delimiter -Header $header | %{$_} }
ELSE 
{Import-Csv $File -delimiter $delimiter | %{$_}}

第一个示例导致对空管道的投诉。第二个导致文件的第一列只是被输出到控制台,然后在文件完成处理时出错,因为管道的其余部分是空的。

一如既往,任何帮助将不胜感激。

谢谢,比尔

4

3 回答 3

4

Eris 已经建议 splatting,但我想举一个更全面的例子,使用你的代码。

# Declare a hash containing the parameters you will always need 
$csvParams = @{
    File = $File;
    delimiter = $delimiter;
}

# if the header is specified, add a Header to $csvParams
if ($Header) { $csvParams.Header = $header }

# Call Import-Csv, splatting $csvParams
Import-Csv @csvParams

喷溅是一种非常有用的技术。获取关于_Splatting 的帮助以获取更多信息。

于 2013-11-06T19:00:10.307 回答
2

最简单的方法就是使用-OutVariableImport-Csv 上的选项

Import-Csv -Path:$File -Delimiter:$Delimiter -OutVariable:CSVContents将其保存在$CSVContents

从 Import-CSV Technet 页面:

此 cmdlet 支持常用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_CommonParameters ( http://go.microsoft.com/fwlink/p/?LinkID=113216 )。

另一种选择是使用 args 哈希并“喷”它:

$myArgs = @{
    Path = "$HOME\temp\foo"
}

Get-Content @myArgs

版本 1 的更新(未经测试):

( IF($Header) { Import-Csv $File -delimiter $delimiter -Header $header }
  ELSE { Import-Csv $File -delimiter $delimiter} ) |
#More pipeline commands here, example:
Format-Table

可怕的恶心版本(未经测试):

$ImportCommand = "Import-Csv $File -delimiter $delimiter"
If($header -ne $null) { $ImportCommand += " -header $header" }
Invoke-Expression $ImportCommand | 
Format-Table
于 2013-11-06T18:35:19.653 回答
1

你的第二种方法是我要走的路。我不确定为什么,您在第二个示例中展示的内容会失败。这是我要做的:

filter ProcessCsv {
    $_ | ... further processing ...
}

$header = Read-Host 'Input your own header?'
if ($header) {
    Import-Csv $file -Delimiter $delimiter -Header $header | ProcessCsv
else {
    Import-Csv $file -Delimiter $delimiter | ProcessCsv
}
于 2013-11-06T18:29:54.770 回答