[PowerShell] - почему имя печатается 2 раза на втором вызове?
От: senglory  
Дата: 05.08.24 17:38
Оценка:
Вот такой скрипт:

Add-Type -AssemblyName System.Web

$fileInGpx = "b.gpx"

[hashtable]$wptsUnique = @{}

[xml]$xml = Get-Content -Path $fileInGpx -Encoding UTF8


function trySetWptColor($wpti, $wptExisting)
{
Write-Host $wpti.name
}

$nsManager = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$nsManager.AddNamespace("osmand", "https://osmand.net")
$nsManager.AddNamespace("gpx", "http://www.topografix.com/GPX/1/1")
$XPath = "//gpx:wpt"
$wpts = $xml.selectNodes($XPath, $nsManager)


foreach($wpt in $wpts)
{
    $wpt2 = $null
    $lat2 = $wpt.lat -as [double]
    $lon2 = $wpt.lon -as [double]
    $key = $lat2 + '' + $lon2

    if ($wptsUnique.ContainsKey($key))
    {
        $wptExisting = $wptsUnique[$key]

Write-Host $wpt.name
        trySetWptColor($wpt, $wptExisting)
    }
    else
    {
        $wpt2 = @{
            lat = 1
            lon = 2
            name = $wpt.name
            extensions = "qqq"
        }        
        $wptsUnique.add($key, $wpt2)
    }
}



Вот файл b.gpx

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<gpx
xmlns='http://www.topografix.com/GPX/1/1'
xmlns:osmand='https://osmand.net'
>
<metadata>
<name>M</name>
</metadata>

<wpt lat="55.9840704" lon="36.6401806">
<name>46Н-02865</name>
<type>M</type>
<extensions>
<osmand:address>46Н-02865</osmand:address>
<osmand:icon>special_star</osmand:icon>
<osmand:background>circle</osmand:background>
<osmand:color>#eecc22</osmand:color>
</extensions>
</wpt>
<wpt lat="55.98407" lon="36.640181">
<name>46Н-02865</name>
<type>M</type>
<extensions>
<osmand:address>46Н-02865</osmand:address>
<osmand:icon>bridge_structure_suspension</osmand:icon>
<osmand:background>circle</osmand:background>
<osmand:color>#eecc22</osmand:color>
</extensions>
</wpt>

</gpx>


Почему при его запуске получается такой странный вывод?

46Н-02865 46Н-02865 46Н-02865


Write-Host с строки 33 выдает нормальное имя, и тут же с 12 — задвоенное. Почему так?
Re: [PowerShell] - почему имя печатается 2 раза на втором вызове?
От: CaptainFlint http://flint-inc.ru/
Дата: 05.08.24 22:13
Оценка:
Здравствуйте, senglory, Вы писали:

S>Почему при его запуске получается такой странный вывод?


Параметры функции задаются через param. Не уверен, как PS трактует определение вида "function f($arg1, $arg2)", я не сталкивался с таким, но если проверить значения аргументов при вызове, видно, что $wpti загребает себе оба входящих аргумента в виде массива, а $wptExisting остаётся пустым. Дальше .name применяется к обоим элементам массива.
Почему же, ё-моё, ты нигде не пишешь «ё»?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.