Бесконечный цикл при чтении .xml-файла - PullRequest
1 голос
/ 12 июня 2019

Я создал скрипт PowerShell для чтения и записи информации / настроек в файл .xml.

Param(
    [string]$mode,
    [string]$set,
    [string]$xml
)

function readSettings([string]$xmlfile, [string]$setting)
{
    $s = readSettings $xmlfile
    $v = $s[$setting]
    Write-Host $v
}

function exportSettings([string]$xmlfile)
{
    $xmlDoc = New-Object XML
    $xmlDoc.Load($xmlfile)
    $settings = @{}
    $xmlDoc.settings.ChildNodes | %{$settings[$_.name] = $_.firstChild.Value}
    return $settings
}

function importSettings([hashtable]$ht,[string]$xmlFile){
    $xmlDoc = New-Object XML
    $xmlDoc.Load($xmlFile)
    foreach ($key in $ht.keys){
        $settingNode = $xmlDoc.SelectSingleNode("/settings/setting[@name='$key']")
        if ($settingNode){
            $settingNode.firstChild.Value = $ht[$key]
        }else{
            $newNode = $xmlDoc.settings.setting[0].Clone()
            $newNode.name = $key
            $newNode.firstChild.Value = $ht[$key]
            $xmlDoc.settings.appendChild($newNode)
        }
    }
    $xmlDoc.Save($xmlFile)
}

if($mode -eq "read")
{
    readSettings($xml, $set)
}

if ($mode -eq "write")
{
}

(также на GitHub .)

Всякий раз, когда ячитать файл .xml, он генерирует бесконечный цикл с потреблением оперативной памяти до 2 ГБ.

Я думал, что причиной может быть

$xmlDoc.settings.ChildNodes | %{$settings[$_.name] = $_.firstChild.Value}

, но я не знаю, как решитьЭто.Запись в xml-файл работает отлично.Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Я думаю, что readSettings сама функция вызывает без теста, и этого достаточно, чтобы сделать цикл, я думаю.

function readSettings([string]$xmlfile, [string]$setting)
{
    $s = readSettings $xmlfile
    $v = $s[$setting]
    Write-Host $v
}
0 голосов
/ 12 июня 2019

Я отошел от дел ... я вызвал неправильную функцию ...

должно быть $s = exportSettings $xmlfile

Извините, ребята, что потратили ваше время :)

на одну проблему меньше ...

спасибо, ребята!

если вам нужно:

function xml_readSettings([string]$xmlfile, [string]$setting)
{
    $xmlDoc = New-Object XML
    $xmlDoc.Load($xmlfile)
    $settings = @{}
    $xmlDoc.settings.ChildNodes | %{$settings[$_.name] = $_.firstChild.Value}
    return $settings[$setting]
}

function xml_exportHashtable([string]$xmlfile)
{
    $xmlDoc = New-Object XML
    $xmlDoc.Load($xmlfile)
    $settings = @{}
    $xmlDoc.settings.ChildNodes | %{$settings[$_.name] = $_.firstChild.Value}
    return $settings
}

function xml_writeSettings([hashtable]$ht, [string]$xmlfile)
{
    $xmlDoc = New-Object XML
    $xmlDoc.Load($xmlFile)
    foreach ($key in $ht.keys){
        $settingNode = $xmlDoc.SelectSingleNode("/settings/setting[@name='$key']")
        if ($settingNode){
            $settingNode.firstChild.Value = $ht[$key]
        }else{
            $newNode = $xmlDoc.settings.setting[0].Clone()
            $newNode.name = $key
            $newNode.firstChild.Value = $ht[$key]
            $xmlDoc.settings.appendChild($newNode)
        }
    }
    $xmlDoc.Save($xmlFile)
}

сейчас работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...