Powershell 从IF-ELSE语句中输出到管道
更新:我刚刚发现我正在运行此功能的客户端是PS V1。我不能使用飞溅。 我有一个处理csv文件的脚本。我事先不知道文件是否有头,因此我提示用户输入头或使用文件中的头:Powershell 从IF-ELSE语句中输出到管道,powershell,csv,conditional-statements,pipeline,Powershell,Csv,Conditional Statements,Pipeline,更新:我刚刚发现我正在运行此功能的客户端是PS V1。我不能使用飞溅。 我有一个处理csv文件的脚本。我事先不知道文件是否有头,因此我提示用户输入头或使用文件中的头: $header = Read-Host 'Input your own header?' 我想做的是能够检查header变量是否已设置为决定在执行Import CSV commandlet时是否要使用该标志 我尝试了以下几点: IF($Header){Import-Csv $File -delimiter $delimiter
$header = Read-Host 'Input your own header?'
我想做的是能够检查header变量是否已设置为决定在执行Import CSV commandlet时是否要使用该标志
我尝试了以下几点:
IF($Header){Import-Csv $File -delimiter $delimiter -Header $header }
ELSE
{Import-Csv $File -delimiter $delimiter} |
或
第一个例子导致了对空管道的投诉。第二个结果是文件的第一列刚刚输出到控制台,然后在处理完文件时出错,因为管道的其余部分是空的
一如既往,任何帮助都将不胜感激
谢谢,
比尔你的第二种方法是我要走的路。我不知道为什么,你在第二个例子中展示的会失败。下面是我要做的:
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
}
你的第二种方法是我要走的路。我不知道为什么,你在第二个例子中展示的会失败。下面是我要做的:
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
}
最简单的方法就是在导入Csv时使用
-OutVariable
选项
Import Csv-Path:$File-Delimiter:$Delimiter-OutVariable:CSVContents
将其保存在$CSVContents
从导入CSV Technet页面:
此cmdlet支持常用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-exputffer和-OutVariable。有关详细信息,请参阅关于公共参数()
另一种选择是使用args散列并“splat”它:
版本1的更新(未测试):
可怕的恶心版本(未经测试):
最简单的方法就是在导入Csv时使用
-OutVariable
选项
Import Csv-Path:$File-Delimiter:$Delimiter-OutVariable:CSVContents
将其保存在$CSVContents
从导入CSV Technet页面:
此cmdlet支持常用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-exputffer和-OutVariable。有关详细信息,请参阅关于公共参数()
另一种选择是使用args散列并“splat”它:
版本1的更新(未测试):
可怕的恶心版本(未经测试):
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的帮助以获取更多信息。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
飞溅是一种非常有用的技术。获取有关\u splating的帮助以获取更多信息。在第一个示例中,空管道错误是由Else子句末尾的额外管道引起的。我认为这样做的想法是IF/Else语句可以馈送到管道中。它们不能像foreach(){}不能输入管道一样。它们是陈述而不是表达。通过使用
$()
将它们放入子表达式中,可以将它们转换为表达式。在第一个示例中,空管道错误是由Else子句末尾的额外管道造成的。我认为这样的想法是IF/Else语句可以馈送到管道中。它们不能像foreach(){}不能输入管道一样。它们是陈述而不是表达。通过使用$()
将它们放入子表达式中,可以将它们转换为表达式。这当然会起作用,但我试图避免在继续处理之前将整个内容存储在内存中。我使用的管道方法是,我可以将文件作为行对象流进行处理。没有问题,只需将处理代码放入函数或过滤器中,如更新的示例所示。使用函数的更新建议非常棒。我已经接受了另一个建议,但我一定会把它放在我的工具箱里。再次感谢。如果您担心无法将整个CSV读入内存,请不要使用该答案中最初建议的-OutVariable
参数。:-)这当然会起作用,但我试图避免在继续处理之前将整个内容存储在内存中。我使用的管道方法是,我可以将文件作为行对象流进行处理。没有问题,只需将处理代码放入函数或过滤器中,如更新的示例所示。使用函数的更新建议非常棒。我已经接受了另一个建议,但我一定会把它放在我的工具箱里。再次感谢。如果您担心无法将整个CSV读入内存,请不要使用该答案中最初建议的-OutVariable
参数。:-)谢谢你,凯文。我把你的标记为答案,因为它清楚地演示了如何有条件地向$params变量添加参数。我不能使用喷溅,所以我将不得不接受这个答案。谢谢你的回答。我把你的标记为答案,因为它清楚地演示了如何有条件地向$params变量添加参数。我不能使用splatting,所以我必须取消接受这个答案。谢谢你的回答。这非常有用,因为我不知道您可以将参数变量传递给commandlets。这仍然很有用,但我不能使用splatting,因为这台机器使用的是PS V1。在发布此问题之前,我实际上已经测试了第一个V1建议,但它也不起作用。我怀疑它正在计算表达式,然后没有向管道传递任何内容。我给出的第二个例子是试图强制PS在其评估时传递某些内容。我将测试第二个版本。谢谢你的帮助。更新建议中的选项2起作用。我只是
$ImportCommand = "Import-Csv $File -delimiter $delimiter"
If($header -ne $null) { $ImportCommand += " -header $header" }
Invoke-Expression $ImportCommand |
Format-Table
# 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