如何在此PowerShell脚本中过滤时使用export-csv替换write-host

时间:2015-08-08 18:57:26

标签: powershell

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

$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,produit 1
  pdt3,produit 3

而不喜欢这个

  

&#34; ID&#34;&#34; libelle&#34;
  &#34; pdt1&#34;,&#34; produit 1&#34;
  &#34; pdt3&#34;,&#34; produit 3&#34;

1 个答案:

答案 0 :(得分:2)

问题有点不清楚,但是我将总结我对它的解释:

  • 您正在迭代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