2017-03-02 111 views
0

我想从以下两个数组搜索并导出到csv的行/结果,但我看不到如何处理输出到文件。powershell - 从foreach数组结果导出csv

$inputfile = import-csv 'C:\Users\Desktop\working\8a.csv' 

$OutAll1 = @() 

foreach($row in $inputfile) 
{ 

if($row.Parameter -contains "Type of file server") 
{ 

echo "Hooray for Type of File Server" 
$OutList = New-Object System.Object 
$OutList | Add-Member -type NoteProperty -Name "Parameter" -Value $line."Type of file server" 
$OutAll1 += $OutList 

} 

if($row.Parameter -contains "File server") 
{ 

echo "File Server" 
$OutList = New-Object System.Object 
$OutList | Add-Member -type NoteProperty -Name "Parameter" -Value $line."Type of file server"   
$OutAll1 += $OutList 
} 

这里是被我轮不到输出为我的数组:

Export-Csv 'c:\users\desktop\working\out.csv' 

或者,如果我做了数组变量:

$data = $outall1 = @() 
foreach($row in $data) {export-csv 'c:\users\desktop\working\out.csv'} 

我的目标是把从结果第一个和第二个搜索词并放入csv中,保留原始列名称(即:“Component,Server,Parameter,Value”)

回答

0

您应该先复制行对象,例如$OutList = $row.PSObject.Copy()(这是适用于CSV处理的浅拷贝)。

但是,它更容易使用流水线和修改行变量$_直接:如果不需要进一步的处理

$csv = Import-Csv 'C:\Users\Desktop\working\8a.csv' | ForEach { 
    if ($_.Parameter -match 'Type of file server') { 
     Write-Information 'Hooray for Type of File Server' 
     $_.Parameter = 'foo' 
    } elseif ($_.Parameter -match 'File server') { 
     $_.Parameter = 'bar' 
    } 
    # now output the modified row so that ForEach collects it in $csv 
    $_ 
} 

,您可以直接导出到另一个CSV没有$csv变量:

Import-Csv 'C:\Users\Desktop\working\8a.csv' | ForEach { 
    ...................... 
    $_ 
} | Export-Csv 'c:\users\desktop\working\out.csv' -NoTypeInformation -Encoding UTF8 

备注:

  • -contains运算符用于数组;字符串使用-match(也正则表达式)或-like(使用通配符)

  • 流水线收集所有输出,包括echo,所以对于辅助消息使用除了Write-Output
    Write-InformationWrite-Host和其它小命令Write-

  • +=在数组的情况下重新创建整个数组:它将旧内容与新元素一起复制到新数组中。这可以说是在PowerShell中填充大型数组的最糟糕的方法。只有在循环内不是一次性操作时才使用+=,或者该数组很小并且时间无关紧要。

0

我已经解决了这个问题。我很欣赏让我发布的网站。以下是解决它的几个主要部分。 1.我需要添加额外的“添加成员noteproperty”来获得我想要的部分行。 2.我正确地尝试“$ varible | export-csv”;然而,在我发布之前我没有成功,也没有明白为什么。这是最后的工作代码:

$inputfile = import-csv 'C:\Users\Desktop\working\8a.csv' 


$OutAll1 = @() 


foreach($row in $inputfile){ 

if($row.Parameter -like "Type of file server"){ 

    echo "Hooray for Type of File Server" 
    $OutList = New-Object System.Object 
    $OutList | Add-Member -type NoteProperty -Name "Component" -Value $row.Component 
    $OutList | Add-Member -type NoteProperty -Name "Server" -Value $row.Server 
    $OutList | Add-Member -type NoteProperty -Name "Parameter" -Value $row.Parameter 
    $OutAll1 += $OutList 

} 

if($row.Parameter -contains "File server"){ 

    echo "File Server" 
    $OutList = New-Object System.Object 
    $OutList | Add-Member -type NoteProperty -Name "Component" -Value $row.Component 
    $OutList | Add-Member -type NoteProperty -Name "Server" -Value $row.Server 
    $OutList | Add-Member -type NoteProperty -Name "Parameter" -Value $row.Parameter  
    $OutAll1 += $OutList 
    } 

$Outall1 | Export-csv 'c:\out.csv' 

我总是错误地在数组中使用$ row和$ line。