powershell - 来自foreach数组结果的export-csv

时间:2017-03-02 16:30:47

标签: powershell

我想从以下两个数组搜索中获取行/结果并导出到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,保留原始列名称("组件,服务器,参数,值和#34;)

2 个答案:

答案 0 :(得分: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(使用通配符)

  • Pipelining收集所有输出,包括echo,因此对于辅助消息使用
    Write-Information以外的Write-HostWrite-以及其他Write-Output个cmdlet。

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

答案 1 :(得分:0)

我已经解决了这个问题。我很欣赏让我发帖的网站。以下是解决它的几个主要部分。 1.我需要添加额外的“Add-member noteproperty”来获取我想要的部分行。 我试图“$ 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。