2016-12-14 17 views
2

私はすべてのアクセスポイントからCSV(ヘッダー付き)を取得しており、XMLアップロードによってZabbixに追加したいと考えています。複数の文字列をCSVのデータに置き換えてください

私は手動で各APのXMLファイルを作成したくないので、PowerShellでこれを実行しようとします。しかし、どう?

私は(Get-Content .\Template.xml).Replace()ForEach-Objectでいくつか試しましたが、まだ成功していません。

ファイル名は以下のとおり

  • AP.csv(APのリスト、ヘッダはホスト名とIPである):

    Hostname;IP 
    AP1;10.29.202.101 
    AP2;10.29.202.102 
    AP3;10.29.202.103 
    AP4;10.29.202.104 
    Ap5;10.29.202.105
  • Template.xml

    <hosts> 
        <host> 
        <host>Hostname</host> 
        <name>Hostname</name> 
        [...] 
        <interfaces> 
         <interface> 
         [...] 
         <ip>PIIP</ip> 
         [...] 
         </interface> 
         <interface> 
    

    Template.xmlが呼び出さ2つのストリングを有しています「ホスト名」と2つの「PIIP」 - 両方ホスト名の文字列はAP.csvの1のホスト名に置き換え、両方のPIIPを関連するIPに置き換える必要があります。

私の最後の試みはこれまでのところだった:

$a = Import-Csv .\Ap.csv 
$APHost = ($a).Hostname 
$APIP = ($a).IP 
$xml = Get-Content .\Template.xml 
foreach ($row in $a) { 
    $xml.Replace('Hostname',$APHost).Replace('PIIP',$APIP) | 
     Out-File ".\Aps\$row.xml" 
} 

しかし、これは1 XMLファイル内のすべてのホスト名およびすべてのIPに終わりました。

私はホスト名とそれに関連するIPで最後に各ホストに1つのXMLファイルを持っています。

+1

これまで – arco444

+0

輸入csvファイルを、あなたが期待する置換と一緒に、あなたはを参照して、XML/CSVファイルのサンプルを追加し、あなたの試みてください?それを試してみましたか? – 4c74356b41

+0

Mainpostを更新しましたが、すでに試してみましたが、私は1つだけのホスト名と関連するIPを選択する方法がわかりません。 – Maik

答えて

1

例:

$CSVData = Import-Csv "$env:userprofile\desktop\Ap.csv" -Delimiter ";" 

$template = Get-Content "$env:userprofile\desktop\template.xml" -Raw 

$count = 1 

foreach ($row in $CSVData) { 

    $template.Replace("Hostname", $row.Hostname).Replace("PIIP", $row.IP) | 
     Out-File "$env:userprofile\desktop\$count.xml" 

    $count++ 

} 
2

あなたの主な問題は次のとおりです。

  • あなたはループの外配列変数($APHost$APIP

  • でAP名とIPアドレスを保存しています
  • これらのアレイを使用する全体としてをループ内に配置してください。を1つずつ参照するのではなく、です。しかし、あなたがあなたの代替品をより堅牢にするために、真のXML解析を使用することを検討すべきである

    $a = Import-Csv -Delimiter ';' .\Ap.csv 
    $xml = Get-Content -Raw .\Template.xml 
    foreach ($row in $a) { 
        $xml.Replace('Hostname', $row.Hostname).Replace('PIIP', $row.IP) | 
         Out-File ".\Aps\$row.xml" 
    } 
    

    :ここ

は、単純反復-適切な値を取得するために$row.Hostname$row.IPを使用して修正、です。

$a = Import-Csv -Delimiter ';' .\Ap.csv 
$xmlTmpl = [xml] (Get-Content -Raw .\Template.xml) 

foreach ($row in $a) { 

    # Find the parent Xml element of the elements to update. 
    $parentEl = $xmlTmpl.hosts.host 

    # Set the hostnames, by element *name*. 
    $parentEl.host = $parentEl.name = $row.Hostname 

    # Set the IP addresses, by element *name* 
    foreach ($el in $parentEl.interfaces.interface.ChildNodes) { 
    if ($el.Name -eq 'ip') { $el.InnerText = $row.IP } 
    } 

    # XPath alternative (doesn't work in PowerShell *Core*): 
    # foreach ($el in $parentEl.SelectNodes('interfaces/interface/ip')) 
    # { 
    # $el.InnerText = $row.IP 
    # } 

    # Save to file 
    # Note: This doesn't include an XML header. 
    $xmlTmpl.OuterXml | Out-File ".\Aps\$row.xml" 
} 

ドキュメント階層内の特定の場所の特定の要素がどのようにターゲットに設定されているかに注意してくださいhichはテンプレートをインスタンス化するより堅牢な方法です(偽陽性の可能性はありません)。

関連する問題