PowerShellを使用してループするXMLファイルの要素を作成するにはどうすればよいですか?

2
SBR 2020-04-23 03:11.

xmlファイルを作成します。.iniファイルから選択したxmlの要素。.iniファイルが1つ以上あります。これを試しましたが、作成できる要素は1つだけです。

私の.iniファイルには2種類のタイプのコンテンツファイルがあります。1日

[Product]
Name = NB A
String = Defaults and Exit

[Controller1]
Desc = Embedded Intel RAID

[Controller2]
Desc = Intel Optane Device

2位。

[Product]
Name = NB A
String = Defaults and Exit

[Controller1]
Desc = Embedded SATA 

XMLの私の期待出力は、2つのタイプがあるでしょう。1日

<Product Name=NB A>
      <Controller controllertype="raid">
      <Controller controllertype="optane">
</Product>

2位。

<Product Name=NB A>
      <Controller controllertype="raid">
</Product>

私がこれまでに書いたコード:

$ProductListXML = "D:\TST.XML" $driver = "D:\ver.xml" 


# get an XMLTextWriter to create the XML
$XmlWriter = New-Object System.XMl.XmlTextWriter($ProductListXML,$Null) # choose a pretty formatting: $xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1 $XmlWriter.IndentChar = "`t"

# write the header
$xmlWriter.WriteStartDocument() $xmlWriter.WriteStartElement('ProductList')
$xmlWriter.WriteAttributeString('Version', '200422a') # load it into an XML object: $xml = New-Object -TypeName XML
$xml.Load($driver)
$FamilyCode = $Xml.drivergroup.family | Select-Object -ExpandProperty Code

foreach ($fc in $FamilyCode)
{
    $FCDesc = $Xml.drivergroup.family | Where-Object { $_.code -eq "$fc" }| Select-Object -ExpandProperty description
    $SystemID = $Xml.drivergroup.family |  Where-Object { $_.code -eq "$fc" } | Select-Object -ExpandProperty Product | Select-Object -ExpandProperty systemid
    $IDSplit = $SystemID -split "/"

    $XmlWriter.WriteStartElement('Family') $XmlWriter.WriteAttributeString('code', "$fc") $XmlWriter.WriteAttributeString('decription', "$FCDesc") foreach($sid in $IDSplit) { $ID = Get-ChildItem -path "D:\product\*$sid*" | Select-Object -ExpandProperty BaseName foreach ($id in $ID) { $File = Get-ChildItem -path "D:\product\*$id*" $ReadINI = @{} 
            Get-Content "$File" | ForEach-Object { $_.Trim()
            } | Where-Object {

            $_ -notmatch '^(;|$)'
            } | ForEach-Object {
            if ($_ -match '^\[.*\]$') {
            $section = $_ -replace '\[|\]'
            $ReadINI[$section] = @{}
            } else {
            $key, $value = $_ -split '\s*=\s*', 2 $ReadINI[$section][$key] = $value } } $ProductName = $ReadINI["Product"]["Name"] $TechType = $ReadINI["Controller1"]["Node"] if($TechType -eq "Intel")
            {
                $TechType = "Intel" } else{ $TechType = "AMD"
            }
            $FactoryDefaultsString = $ReadINI["Product"]["String"]

            $YearPath = "D:\*.txt" $YearMapping = Select-String -Path $YearPath -Pattern "$id" 
            if($YearMapping -like "*2017*") { $Year = "2017"
            }
            elseif($YearMapping -like "*2018*") { $Year = "2018"
            }
            elseif($YearMapping -like "*2019*") { $Year = "2019"
            }
            elseif($YearMapping -like "*2020*") { $Year = "2020"
            }
            elseif($YearMapping -like "*2021*") { $Year = "2021"
            }

            $XmlWriter.WriteStartElement('Product') $XmlWriter.WriteAttributeString('Name', "$ProductName") $XmlWriter.WriteAttributeString('SSID', "$id") $XmlWriter.WriteAttributeString('TechType', "$TechType") $XmlWriter.WriteAttributeString('Year', "$Year") $XmlWriter.WriteAttributeString('FactoryDefaultsString', "$FactoryDefaultsString") $Controller2 = Select-String -Path $File -Pattern "Controller2" | Select-Object -ExpandProperty Filename foreach ($cont2 in $Controller2) { $file = Get-ChildItem "D:\product\$cont2" $ReadTechTp = @{} 
                Get-Content "$file" | ForEach-Object { $_.Trim()
                } | Where-Object {

                $_ -notmatch '^(;|$)'
                } | ForEach-Object {
                if ($_ -match '^\[.*\]$') {
                $section = $_ -replace '\[|\]'
                $ReadTechTp[$section] = @{}
                } else {
                $key, $value = $_ -split '\s*=\s*', 2 $ReadTechTp[$section][$key] = $value } } $Desc = $ReadTechTp["Controller2"]["Desc"] if($Desc -like "*RAID*" -or $Controller1 -like "*SATA*") { $ControllerType = "RAID"
                }
                else{
                    $ControllerType = "OPTANE" } $XmlWriter.WriteStartElement('Controller')
                $XmlWriter.WriteAttributeString('ControllerType', "$ControllerType")

            }


            $xmlWriter.WriteEndElement() } } $xmlWriter.WriteEndElement()
}

    $xmlWriter.WriteEndElement() # finalize the document: $xmlWriter.WriteEndDocument()
$xmlWriter.Flush() $xmlWriter.Close()

どなたでもお手伝いできます。アドバイスと解決策は本当にありがたいです。ありがとうございました

1 answers

1
RoadRunner 2020-04-23 14:53.

これがあなたがそれをすることができる方法です:

  • ヘッダーに一致する正規表現を作成します。これはのようなものである可能性があります^\[(.+)\]$

    • マッチとラインの開始します^
    • 最初に見つけた[とブラケットを\[
    • 1回以上のグループ内の任意の文字に一致し(.+)
    • 最後の角かっこ]\]をで一致させ、行を$。で終了します。
  • キーと値に一致する正規表現を作成します。これはのようなものである可能性があります^(.+?)\s*=\s*(.*)$

    • と行の先頭と一致し^
    • 任意の文字1またはで、無制限の時間でキーを検索し(.+?)
    • =記号と記号の間の0個以上の空白に一致します\s*=\s*
    • グループ内の0個以上の文字をと一致させ(.*)、行を$。で終了します。

上記を念頭に置いて、.iniファイル構造をネストされたハッシュテーブルとして返す関数を作成できます。-File-Regexスイッチを使用しswitchてファイルを読み取り、正規表現パターンを検索します。about_Switch詳細については、をご覧ください。

ただし、コメントや無効なエントリの処理など、より多くのエラーチェックが必要になる可能性があります。上記の.iniファイルで機能するものを作成しました。

function Get-IniFile {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$FilePath
    )

    $ini = [ordered]@{} switch -Regex -File $FilePath {

        # Match headers
        "^\[(.+)\]$" { $section = $Matches[1] $ini[$section] = [ordered]@{} continue } # Match key-value pairs "^(.+?)\s*=\s*(.*)$" {
            $name, $value = $matches[1..2] $ini[$section][$name] = $value continue } } return $ini
}

そして、あなたは2つの反復可能性.iniのファイルを、言うことができますfirst.inisecond.ini。から返されたハッシュテーブルを使用して、両方のXMLファイルを作成しますGet-IniFile

$iniFiles = "first.ini", "second.ini" # Go through each .ini file foreach ($file in $iniFiles) { # Create XML object to write to $xml = New-Object -TypeName System.Xml.XmlDocument

    # Get .ini file data into a hashtable
    $iniFileData = Get-IniFile -FilePath $file

    # Iterate first set of keys from hashtable
    foreach ($kvp in $iniFileData.GetEnumerator()) {

        # Create a product root key for the header
        $product = $xml.CreateElement($kvp.Key) # Iterate through key-value pairs foreach ($value in $kvp.Value.GetEnumerator()) { switch ($value.Name)
            {

                # If we found a name, this attribute belongs to the header
                "Name" {
                    $product.SetAttribute($value.Name, $value.Value) $xml.AppendChild($product) break } # Otherwise we found a descendent node "Desc" { # Create descendent controller node $controller = $xml.CreateElement("Controller") # Determine how to set the attributes depending on the value if ($value.Value -like "*RAID*" -or $value.Value -like "*SATA*") { $controller.SetAttribute("controllertype", "raid");
                    } else {
                        $controller.SetAttribute("controllertype", "optane"); } # Append controller node to product root node $xml.Product.AppendChild($controller) break } } } } # Save to XML file, using the name from the original file $filename = [System.IO.Path]::GetFileNameWithoutExtension($file) $xml.Save("{0}.xml" -f $filename)
}

first.xml

<Product Name="NB A">
  <Controller controllertype="raid" />
  <Controller controllertype="optane" />
</Product>

second.xml

<Product Name="NB A">
  <Controller controllertype="raid" />
</Product>

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

iOS9でSiriに尋ねることができるすべての新しいもの

iOS9でSiriに尋ねることができるすべての新しいもの

AppleがiOS9を発表したときの大きな話題の1つは、Siriがどのように改善され、より「プロアクティブ」になるかということでした。最初はそれが何を意味するのか実際にはわかりませんでしたが、iOSが1週間使用されたので、iOSに何を依頼できるかについてはるかに良いアイデアが得られました。

「食料品の請求書はあなたが絶対に管理できるものの1つです」

「食料品の請求書はあなたが絶対に管理できるものの1つです」

非常に多くのサービスと生活費には、たまにしか変わらない設定価格があります。ただし、食料品の請求書は、閉じ込められておらず、完全に管理できる唯一の場所の1つです。

デスティニーのエキゾチックな戦利品ドロップで何か奇妙な

デスティニーのエキゾチックな戦利品ドロップで何か奇妙な

Destinyにとって興味深い週末でした。新しいエクスプロイトのおかげで、プレイヤーはゲームの戦利品システムがどのように機能するかを通常よりも詳しく見ることができました。

Destinyの最新のエクスプロイトでエキゾチックな自分を殺すことができます[更新:パッチ]

Destinyの最新のエクスプロイトでエキゾチックな自分を殺すことができます[更新:パッチ]

今日Destinyをプレイし始めた場合、同じ古代の低レベルのミッションを実行している友人の数が異常に多いことに気付いたかもしれません。なぜ彼らはそうするのでしょうか?答えは-もちろんこれが答えです-ミッションはプレイヤーが新しい抜け穴を利用し、最小限の労力でたくさんの強力なエキゾチックなアイテムを獲得できるようにすることです。

アマゾンの買い物客はこれを「ホテル品質」の羽毛布団カバーと呼んでおり、価格はわずか22ドルです

アマゾンの買い物客はこれを「ホテル品質」の羽毛布団カバーと呼んでおり、価格はわずか22ドルです

何千人もの Amazon の買い物客が Bedsure Duvet Cover を推奨しており、現在セール中です。羽毛布団カバーにはいくつかの色があり、ツインからカリフォルニアキングまでのサイズがあります。Amazon で最大 52% オフの最高評価の羽毛布団カバーを購入する

バレンタインデーにユーカリのシャワースチーマーで「最高の睡眠」を贈りましょう。

バレンタインデーにユーカリのシャワースチーマーで「最高の睡眠」を贈りましょう。

BodyRestore ユーカリ シャワー スチーマーは、Amazon で 11,000 を超える 5 つ星の評価を得ています。セルフケアが必要な人へのバレンタインデーのギフトとして、ホームスパ製品を贈りましょう。

この「邪悪な吸引力」を備えたこの250ドルのハンドヘルド掃除機は、Amazonで75%オフになりました

この「邪悪な吸引力」を備えたこの250ドルのハンドヘルド掃除機は、Amazonで75%オフになりました

多くのAmazonの買い物客がUmlo H6ハンドヘルド掃除機を推奨しており、現在スーパーセール中です. ハンドヘルド デバイスには HEPA フィルターが装備されており、複数のアタッチメントが付属しています。Amazonで75%オフのときにハンドヘルド掃除機を購入する

オクタヴィア・スペンサー、「ザ・ヘルプ」共演者のシシー・スペイセクが17歳で映画のインターンをした後、彼女のことを「実際に」思い出したと語る

オクタヴィア・スペンサー、「ザ・ヘルプ」共演者のシシー・スペイセクが17歳で映画のインターンをした後、彼女のことを「実際に」思い出したと語る

オクタヴィア・スペンサーは、ヘルプで一緒に共演するずっと前に、シシー・スペイセク主演の 1990 年の映画「ロング・ウォーク・ホーム」でインターンとして働いていました。

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

良いものと醜いもの: 2022

良いものと醜いもの: 2022

もうわからない。何が「ヒット」かを正確に判断することは、もはやほとんど不可能に思えます。

楽しみのために — 2022 年のトップの新しい音楽再生

楽しみのために — 2022 年のトップの新しい音楽再生

ついに!私の 2022 年のトップ ニューミュージック プレイへようこそ。私は毎年これを共有して、友達とつながります。

ヒーズ・オール・アイヴ・ガット

ヒーズ・オール・アイヴ・ガット

あなたの心をチェックしてください。私たちの心はしばしば迷います。

Language