【问题标题】:How to replace write-host with export-csv while filtering in this powershell script如何在此 powershell 脚本中过滤时用 export-csv 替换 write-host
【发布时间】:2015-11-01 01:30:23
【问题描述】:

在此脚本中使用 Where-Object(有点像本示例中的 Import-Csv How to export to "non-standard" CSV with Powershell)进行过滤时,我找不到将 Write-Host 替换为 Export-Csv 的语法:

$xml=[xml]@'
<?xml version="1.0" encoding="iso-8859-1"?>
<catalogue>
  <produits>
    <produit id="pdt1" libelle="produit 1" cat="PDT">
      <metas date="2015.07.24">
        <meta code="123456" value="123456"></meta>
        <meta code="789012" value="ghijkl"></meta>
        <meta code="345678" value="mnopqr"></meta>
      </metas>
    </produit>
    <produit id="pdt2" libelle="produit 2" cat="PDT">
      <metas date="2015.07.24">
        <meta code="111111" value="abcdef"></meta>
        <meta code="789012" value="ghijkl"></meta>
        <meta code="345678" value="mnopqr"></meta>
      </metas>
    </produit>
    <produit id="pdt3" libelle="produit 3" cat="PDT">
      <metas date="2015.07.24">
        <meta code="123456" value="123456"></meta>
        <meta code="789012" value="ghijkl"></meta>
        <meta code="345678" value="mnopqr"></meta>
      </metas>
    </produit>
  </produits>
</catalogue>
'@

$out_csv = "C:\out.csv"

$meta_code = "123456"

$produit_code = "pdt1"
$produit=$xml.catalogue.produits.produit | where {$_.id –like "$produit_code"}

$xml.catalogue.produits.produit | where {$_.cat.startsWith("PDT")} | ForEach-Object {
$meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$($_.id)']/metas/meta[@code='$meta_code']")
if($meta) {Write-Host "$($_.id),$($_.libelle)"}
}

更新:我真的想要与 Write-Host 相同的输出,即没有标题和这样的引号:

pdt1,产品 1
pdt3,产品 3

不是这样的

"id","libelle"
"pdt1","产品 1"
"pdt3","产品 3"

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这个问题写的有点不清楚,但我要总结一下我对它的解释:

    • 您正在遍历 XML 以查找特定字段。
    • 您有一个循环,您可以在其中测试要满足的条件,如果是这样,您希望获取 2 个特定字段并将它们作为一行写入 CSV。

    Export-Csv 获取一个对象或对象集合,并使用其中的属性创建 CSV。

    在我看来,解决这个问题的最佳方法是将Write-Host 替换为[PSObject];这将在您的ForEach-Object 循环的每次迭代中返回,然后从该循环返回的整个集合可以直接通过管道传输到Export-CSV

    $xml.catalogue.produits.produit | where {$_.cat.startsWith("PDT")} | ForEach-Object {
        $meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$($_.id)']/metas/meta[@code='$meta_code']")
        if($meta) {
            New-Object PSObject -Property @{ id = $_.id ; libelle = $_.libelle }
        }
    } | Export-Csv -Path C:\whatever\my.csv -NoTypeInformation
    

    根据您关于不需要标题和引号的评论,我会这样做:

    $csv = $xml.catalogue.produits.produit | where {$_.cat.startsWith("PDT")} | ForEach-Object {
        $meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$($_.id)']/metas/meta[@code='$meta_code']")
        if($meta) {
            New-Object PSObject -Property @{ id = $_.id ; libelle = $_.libelle }
        }
    } | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
    $csv = $csv -replace '"',''
    $csv | Out-File -FilePath C:\whatever\my.csv
    

    Out-File 默认为 Unicode。如果你需要 ASCII 添加-Encoding Ascii

    【讨论】:

    • 几乎没问题,但我还需要像 Write-Host 一样在输出中没有标题和引号
    • 它有效(我认为你犯了一个错误,而不是 -Path 它是 -filepath)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2018-11-28
    • 1970-01-01
    • 2020-08-20
    • 2021-06-09
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多