Лучший отвечающий
Как сделать древовидный объект?

Вопрос
-
Добрый день, Коллеги!
Задался вопросом, а можно ли создать древовидный объект, например из файла 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