更新:我刚刚发现我运行的客户端是PS V1。我不能使用splatting。
我有一个处理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 | %{$_}}
第一个例子导致对空管道的抱怨。第二个结果是文件的第一列只是输出到控制台,然后在文件完成处理时出错,因为管道的其余部分是空的。
一如既往,我们将不胜感激。
谢谢, 比尔
答案 0 :(得分: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是一种非常有用的技术。 Get-Help about_Splatting有关它的更多信息。
答案 1 :(得分:2)
最简单的方法是在Import-Csv上使用-OutVariable
选项
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哈希并“splat”它:
$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
答案 2 :(得分: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
}