如何在此powershell脚本中进行筛选时将写入主机替换为导出csv

如何在此powershell脚本中进行筛选时将写入主机替换为导出csv,powershell,Powershell,在此脚本中,当使用Where对象(在本例中有点像Import Csv)进行过滤时,我找不到将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

在此脚本中,当使用Where对象(在本例中有点像Import Csv)进行过滤时,我找不到将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)"}
}
$xml=[xml]@'
'@
$out\u csv=“C:\out.csv”
$meta_code=“123456”
$produit_code=“pdt1”
$produit=$xml.catalog.produits.produit |其中{$\u.id–类似于“$produit\u code”}
$xml.catalog.produits.produit |其中{$\ cat.startsWith(“PDT”)}ForEach对象{
$meta=$xml.SelectSingleNode(“//catalog/produits/produit[@id='$($\uu.id)]]/metas/meta[@code='$meta\u code']”)
if($meta){Write Host“$($.id),$($.libelle)”}
}
更新:我真的想要和写主机ie一样的输出,没有标题和引号,如下所示:

pdt1,产品1
pdt3,产品3

而不是像这样

“身份证”、“诽谤罪”
“pdt1”、“产品1”
“pdt3”、“产品3”


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

  • 您正在遍历XML以查找特定字段
  • 您有一个循环,在其中测试要满足的条件,如果是这样,您希望获取2个特定字段,并将它们作为一行写入CSV
导出Csv
获取对象或对象集合,并使用其中的属性创建Csv

在我看来,最好的方法是用创建一个
[PSObject]
来替换
写主机
;这将在
ForEach对象
循环的每次迭代中返回,然后从中返回的整个集合可以通过管道直接传输到
Export CSV

$xml.catalog.produits.produit |其中{$\目录.cat.startsWith(“PDT”)}ForEach对象{
$meta=$xml.SelectSingleNode(“//catalog/produits/produit[@id='$($\uu.id)]]/metas/meta[@code='$meta\u code']”)
如果($meta){
新对象PSObject-Property@{id=$\.id;libelle=$\.libelle}
}
}|导出Csv-路径C:\which\my.Csv-notype信息
根据您关于不需要标题和引号的评论,我会这样做:

$csv=$xml.catalogy.produits.produit |其中{$$\ cat.startsWith(“PDT”)}ForEach对象{
$meta=$xml.SelectSingleNode(“//catalog/produits/produit[@id='$($\uu.id)]]/metas/meta[@code='$meta\u code']”)
如果($meta){
新对象PSObject-Property@{id=$\.id;libelle=$\.libelle}
}
}|转换为Csv-非类型信息|选择对象-跳过1
$csv=$csv-替换“”,“”
$csv |输出文件-文件路径C:\which\my.csv

Out File
默认为Unicode。如果您需要ASCII添加
-编码ASCII

几乎可以,但我还需要在输出中没有标题和引号,就像Write Hostit那样(我认为您使用了mistypo而不是-Path it's-filepath)