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