0

私はPowershellにかなり慣れていません。私によると、かなり奇妙なxmlがあります。私の主な目的は、XMLをCSVに変換し、データベースとの同期にさらに使用することです。Powershell コードを使用して、xml をハッシュに抽出しました。今、それらをCSVに変換する際に問題があります。Export-csv は、ハッシュの最後のエントリのみを書き込みます。理由がわからないので、他のいくつかのフォーラムをチェックしましたが、Export-csv の -append 機能は powershell 3.0 のみであるとのことで、私は 1.0 を使用しています。

これから私を助けてくれますか?

XML :

<catalog>
<segment>
<segmentname>Batch</segmentname>
<hosts>
<host>
<hostname>cglist17</hostname>
</host>
<host>
<hostname>cglist18</hostname>
</host>
<host>
<hostname>cglist19</hostname>
</host>
<host>
<hostname>cglist20</hostname>
</host>
</hosts>
</segment>
<segment>
<segmentname>Custom S2</segmentname>
<hosts>
<host>
<hostname>cglist21</hostname>
</host>
<host>
<hostname>cglist22</hostname>
</host>
</hosts>
</segment>
<segment>
<segmentname>eCommerce</segmentname>
<hosts>
<host>
<hostname>cglist09</hostname>
</host>
<host>
<hostname>cglist10</hostname>
</host>
</hosts>
</segment>
</catalog>

Powershell コード:

[xml]$xd=gc "C:\Users\sxa8869\Desktop\Webserv\segmentcat.xml"
$nodelist = $xd.selectnodes("/catalog/segment")

$MasterArray = @()
$MasterArray = "" | Select segmentname,hosts

$file="C:\Users\sxa8869\Desktop\Webserv\sha.csv"

foreach ($node in $nodelist) {

  $hostsNode = $node.selectSingleNode("hosts")
  $segmentname = $node.selectSingleNode("segmentname")
  $MasterArray.segmentname=$segmentname.get_InnerXml()
  foreach ($hostitem in $hostsNode) {
    $hostnamenodes = $hostitem.selectnodes("host")
    foreach ($hostname in $hostnamenodes) {
      $MasterArray.hosts=$hostname.selectSingleNode("hostname").get_InnerXml()

#- Displays the hash in table format, want this format in csv
         $MasterArray        

# - displaying only the last element
      $MasterArray | export-csv "file.csv" -notype      

# - this works, but i want to use export-csv to get it in this format
 '"'+$MasterArray.segmentname+'"'+","+'"'+$MasterArray.hosts+'"'    

    }     
  } 
} 


Required output :-
 -----------------
"segmentname","hosts"
"Batch","cglist17"
"Batch","cglist18"
"Batch","cglist19"
"Batch","cglist20"
"Custom S2","cglist21"
"Custom S2","cglist22"
"eCommerce","cglist09"
eCommerce,"cglist10"
4

2 に答える 2

1

あなたは物事を過度に複雑にしていると思います。これを試して:

$myXML = [xml](Get-Content "C:\Users\sxa8869\Desktop\Webserv\segmentcat.xml")
$file="C:\Users\sxa8869\Desktop\Webserv\sha.csv"

$myArray = @()
foreach ($s in $myXML.catalog.segment)
{
    foreach ($h in $s.hosts.host)
    {
        $myArray += New-Object -TypeName PSObject -Property @{"Segment Name" = $s.segmentname; "Host Name" = $h.hostname}
    }
}

$myArray | Export-Csv $file -NoTypeInformation
于 2013-02-20T15:38:02.553 に答える
0

ここには複数の問題があります。まず、配列を作成しますMasterArrayが、それを で作成したカスタム オブジェクトと等しくなるように設定しますSelect。現在MasterArrayは配列ではなく、単一のpscustomobject. 2 つ目は、単一オブジェクトのプロパティに値を設定すると、毎回最後のエントリが上書きされます。配列には複数のオブジェクトを含める必要があります。書き直しました。パイプラインなどを使用して改善したわけではありませんが、エラーを修正しただけです;-)スクリプト:

[xml]$xd = gc "C:\Users\sxa8869\Desktop\Webserv\segmentcat.xml"
$nodelist = $xd.selectnodes("/catalog/segment")

$MasterArray = @()

$file="C:\Users\sxa8869\Desktop\Webserv\sha.csv"

foreach ($node in $nodelist) {

    $hostsNode = $node.SelectSingleNode("hosts")
    $segmentname = $node.SelectSingleNode("segmentname")
    #Store static value for all objects in $node
    $segname = $segmentname.InnerText

    foreach ($hostitem in $hostsNode) {
        $hostnamenodes = $hostitem.SelectNodes("host")
        foreach ($hostname in $hostnamenodes) {
            #Add hostrecord to array
            $MasterArray += New-Object psobject -Property @{
            "Segment Name" = $segname
            "Host Name" = $hostname.InnerText
            }
        }
    }
}

#Output to console
$MasterArray        

#Save to file (path in $file variable  =  "...\sha.csv").
#Using Select-Object to specify order of columns
$MasterArray | Select-Object "Segment Name", "Host Name" | Export-Csv $file -NoTypeInformation

「sha.csv」の出力:

"Segment Name","Host Name"
"Batch","cglist17"
"Batch","cglist18"
"Batch","cglist19"
"Batch","cglist20"
"Custom S2","cglist21"
"Custom S2","cglist22"
"eCommerce","cglist09"
"eCommerce","cglist10"
于 2013-02-20T15:23:17.707 に答える