【问题标题】:Powershell - extract to csv from the loopPowershell - 从循环中提取到 csv
【发布时间】:2020-03-15 16:15:23
【问题描述】:

当我试图从这段代码中提取结果时

$Output = @()
foreach($emailproxy in $emailproxies)
{
if($emailproxy.Mail -like "*com" -or $emailproxy.Mail -like "*org"){ Write-Host $emailproxy.Mail} 
 $Output = New-Object -TypeName PSObject -Property @{
        Mail = $emailproxy.Mail
    } | Select-Object Mail
}

$Output | Export-Csv C:\TempDownloads\results.csv

我只得到 1 个结果.. 为什么会这样?

【问题讨论】:

    标签: powershell foreach


    【解决方案1】:

    对于循环中的每次迭代,您将值直接分配(覆盖)给$Output 变量,而不是将值添加到数组中。

    在 for 循环中,您需要将 $Output = 替换为 $Output +=

    • $Output = <new value> -> 将<new value> 分配给$Output 变量,$Output 的现有值被覆盖并丢失。

    • $Output += <new value> 等价于$Output = $Output + <new value>,其中<new value>$Output 的当前值首先组合,然后分配给$Output

    【讨论】:

    • 很好的解释; @WiktorKostrzewski,虽然这是您问题的直接解决方案,但在循环中增量“扩展”数组效率低下,因为 new 数组必须在每次迭代中在幕后创建,因为数组是不可变;一种更有效的方法是将foreach 循环用作表达式,并让PowerShell 自动将输出收集到一个数组中:[array] $Output = foreach (...) { ... } - 请参阅this answer
    【解决方案2】:

    这是因为您每次都重写了变量 $output。您需要使用 add-member 将属性附加到 psobject

    Output = New-Object -TypeName Psobject 
    foreach($emailproxy in $emailproxies) { if($emailproxy.Mail -like "*com" -or $emailproxy.Mail -like "*org"){ Write-Host $emailproxy.Mail} 
    $Output | Add-Member -MemberType NoteProperty -Name "Mail" -Value $_.mail
    }
     $Output | Export-Csv "filepath"
    

    【讨论】:

    • Add-Member:无法将参数绑定到参数“InputObject”,因为它为空。在 line:3 char:11 + $Output | Add-Member -MemberType NoteProperty -Name "Mail" -Value $_。 ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Add-Member], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.AddMemberCommand Add-Member : 无法将参数绑定到参数' InputObject' 因为它是空的。
    • 目的是创建一个自定义对象的array,收集到$Output
    猜你喜欢
    • 2016-03-13
    • 2016-07-11
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多