Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从IF-ELSE语句中输出到管道_Powershell_Csv_Conditional Statements_Pipeline - Fatal编程技术网

Powershell 从IF-ELSE语句中输出到管道

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

更新:我刚刚发现我正在运行此功能的客户端是PS V1。我不能使用飞溅。

我有一个处理csv文件的脚本。我事先不知道文件是否有头,因此我提示用户输入头或使用文件中的头:

$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