none
Как сделать древовидный объект? RRS feed

  • Вопрос

  • Добрый день, Коллеги!
    Задался вопросом, а можно ли создать древовидный объект, например из файла INI.
    К примеру файл:
    [Default]
    param1=val1
    param2=val2
    
    [Custom]
    param1=val3
    param2=val4
    надо превратить в объект:
    $objini.Default.param1
    $objini.Custom.param1
    и т.д.

    29 июня 2009 г. 6:14

Ответы

  • у меня есть какие-то наработки на эту тему, правда, не до конца доделано:
    function Import-INI ($path) {
        $Hash = @{}
        $CurSect = ""
        $CurObj = $null
        switch -regex -file $path {
            '^\s*\[([^[]+)\]' { #Section name
                write-host "Matched section [$($matches[1])]"
                if ($CurSect) {
                    $Hash[$CurSect] = $CurObj
                }
                $CurSect = $matches[1]
                $CurObj = new-object psobject
            }
            '^(\S+)\s*=\s*"(.+)"\s*$' { #Parameter with quotes
                write-host "Matched parameter $($matches[1])='$($matches[2])'"
                $CurObj | Add-Member noteproperty -name ($matches[1]) -value ($matches[2])
                }
            '^([^=\s]+)\s*=\s*(.+)\s*$' { #Parameter
                write-host "Matched parameter $($matches[1])='$($matches[2])'"
                $CurObj | Add-Member noteproperty -name ($matches[1]) -value ($matches[2])
            }
            #Comment
            '^[\;#](.*)$' {write-host "; $($matches[1])"}
            default {write-warning "Unable to parse '$_'"}
            }
        $Hash
    }
    $a = import-ini ".\settings.ini"
    можете взять это за основу и довести под свои нужны.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа ToIIIa 29 июня 2009 г. 9:29
    29 июня 2009 г. 9:05

Все ответы

  • у меня есть какие-то наработки на эту тему, правда, не до конца доделано:
    function Import-INI ($path) {
        $Hash = @{}
        $CurSect = ""
        $CurObj = $null
        switch -regex -file $path {
            '^\s*\[([^[]+)\]' { #Section name
                write-host "Matched section [$($matches[1])]"
                if ($CurSect) {
                    $Hash[$CurSect] = $CurObj
                }
                $CurSect = $matches[1]
                $CurObj = new-object psobject
            }
            '^(\S+)\s*=\s*"(.+)"\s*$' { #Parameter with quotes
                write-host "Matched parameter $($matches[1])='$($matches[2])'"
                $CurObj | Add-Member noteproperty -name ($matches[1]) -value ($matches[2])
                }
            '^([^=\s]+)\s*=\s*(.+)\s*$' { #Parameter
                write-host "Matched parameter $($matches[1])='$($matches[2])'"
                $CurObj | Add-Member noteproperty -name ($matches[1]) -value ($matches[2])
            }
            #Comment
            '^[\;#](.*)$' {write-host "; $($matches[1])"}
            default {write-warning "Unable to parse '$_'"}
            }
        $Hash
    }
    $a = import-ini ".\settings.ini"
    можете взять это за основу и довести под свои нужны.
    [тут могла быть ваша реклама] http://www.sysadmins.lv
    • Помечено в качестве ответа ToIIIa 29 июня 2009 г. 9:29
    29 июня 2009 г. 9:05
  • у меня получился вот такой скрипт (надеюсь, Вадим не обидится, ведь, я видел его вариант, который он написал по моей просьбе ;)

    ############################################################################################################################
    ## PoSh Function Get-IniContent 20090318 ShS
    ## Фунция производит разбор (parssing) Ini-файла, возвращая на выходе переменную,
    ## содержащую все секции и параметры этого Ini-файла
    ## Пример вызова: Get-IniContent <путь_к_ini-файлу>
    ############################################################################################################################
    Function Get-IniContent ([string] $path) {
    #
    $IniStrings=Get-Content $path
    #
    #Символ-разделитель, обозначающий начало коментария в ini-файле
    $CommentLetter=";"
    #Опция, заставляющая метод string.split() отбрасывать образовавшиеся пустые строки
    $REE=[StringSplitOptions]::RemoveEmptyEntries
    #
    $Ini=@{}
    $CurrentSection=""
    for ($i=0; $i -lt $IniStrings.count; $i++)
    {
    #Удаляем коментарии, ведущие и конечные пробелы и табуляции
    $Data=(($IniStrings[$i] -replace "$CommentLetter[\S `t]*") -replace "^[ `t]*") -replace "[ ^t]*$"
    #Делим строку надвое, в качестве разделителя используем символ "=", отбрасываем образовавшиеся пустые строки
    #в результате получаем либо массив, элемент [0] которого содержит строку с заголовком секции ini-файла,
    #либо масив из двух элементов, содержащих название и величину параметра текущей секции ini-файла
    $ParsedData=$Data.split("=",$REE)
    #Является ли полученная строка заголовком секции ini-файла?
    if ($ParsedData -match "\[[\S]\]*")
     {
      #Получаем название текущей секции, отбрасывая квадратные скобки, а так же ведущие и оконечные пробелы и знаки табуляции
      $CurrentSection=([String]$ParsedData[0].split("[]") -replace "^[ `t]*") -replace "[ `t]*$"
      #Дополняем результирующую переменную, новой секцией
      $Ini["$CurrentSection"]=@{}
     }
    else {
      #Получаем название параметра и его значение, отбрасывая ведущие и оконечные пробелы и знаки табуляции
      $ParamName=($ParsedData[0] -replace "^[ `t]*") -replace "[ `t]*$"
      $ParamValue=($ParsedData[1] -replace "^[ `t]*") -replace "[ `t]*$"
      if ($ParamName -ne "")
      {
       #Дополняем текущую секцию (в результирующей переменной) очередными параметром и его значением
       $Ini["$CurrentSection"]["$ParamName"]= $ParamValue
      }
      }
    }
    #Передаем результат во внешний мир
    $Ini
    }

     


    $NetHaspIni = Get-IniContent C:\Scripts\PoSh.try\GetFromINI\NETHASP.INI

    #"================="
    $NetHaspIni | fl
    "======="
    $NetHaspIni["NH_TCPIP"]
    "======"
    $NetHaspIni["NH_TCPIP"]["NH_SERVER_ADDR"]
    "==============="
    $NetHaspIni.Keys; $NetHaspIni.Values
    "--------"
    $NetHaspIni["NH_COMMON"]["NH_IPX"]

    • Изменено s.h.s. _ 29 июня 2009 г. 17:37
    29 июня 2009 г. 17:30
  • У меня получился такой - без проверки на комментарии:


    if ($args[0]) { $ini=get-content $args[0] } else { "Нет аргументов"; exit }
    
    $cnt=0
    $newhash=@{}
    $ini | %{ if ($_ -match "^\[.+\]$") { [string] $sec="$cnt" $newhash.$sec=@{} $newhash.$sec.Section="$($_ -replace '[\[\]]','')" $cnt++ } else { $param=($_ -replace '=.+','') $value=($_ -replace '.+=','') $newhash.$sec.$param="$value" } } 0..$cnt | %{ [string] $sec="$_"; $newhash.$sec }

    вызывать: .\script test.ini
    • Изменено 01MDM 29 июня 2009 г. 18:35
    29 июня 2009 г. 18:17