从IF ELSE语句中输出到管道

时间:2013-11-06 18:22:05

标签: powershell csv conditional-statements pipeline

更新:我刚刚发现我运行的客户端是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 | %{$_}}

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

一如既往,我们将不胜感激。

谢谢, 比尔

3 个答案:

答案 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
}