Получить свойство объекта PowerShell из пути в параметре - PullRequest
0 голосов
/ 28 июня 2019

Как настроить PowerShell для выбора свойства объекта (верхнего уровня или вложенного) на основе содержимого переменной?

У меня есть сценарий PowerShell, который считывает содержимое файла (JSON), преобразует егок объекту, а затем выбирает одно из свойств.Однако содержимое не согласовано, и расположение требуемого свойства в JSON может измениться.

Я хотел бы иметь возможность установить в сценарии параметр -PropertyPath, который позволит пользователям передавать данныепуть к требуемому свойству внутри объекта.

Возьмем следующий пример, который позволяет выбрать свойство объекта на основе значения -PropertyPath.Это работает, потому что свойство не является вложенным.

$PropertyPath= "myProperty"
$definition = (Get-Content -Path $definitionFilePath -Raw | ConvertFrom-Json).$PropertyPath

Теперь возьмем следующий неудачный пример, где свойство для получения вложено (и существует), которое завершается с ошибкой, но $definition пусто -предположительно потому, что свойства с именем random.myProperty не существует.

$PropertyPath= "random.myProperty"
$definition = (Get-Content -Path $definitionFilePath -Raw | ConvertFrom-Json).$PropertyPath

Любая помощь приветствуется.

1 Ответ

1 голос
/ 28 июня 2019

Точка '.' свойство представляет оператор разыменования . Кажется, что Powershell обрабатывает всю строку как имя свойства.

Один из способов получить желаемую функциональность: использовать вспомогательную функцию для ручного анализа и обхода пути ( через ):

function OutputNested ($obj, $Value )
{
    $value_array = $Value.split(".");    
    $output = $obj;
    foreach ( $nested in $value_array ) 
    {
        $output = $output.$nested;
    }
    return $output;
}

$PropertyPath= "stuff.onetype"
$definitionFilePath = "C:\Users\UserName\Source\powershell\so12943819\so12943819.json"

# Works directly
#$definition = $(Get-Content -Path $definitionFilePath -Raw | ConvertFrom-Json).stuff.onetype

# Works via helper function
$definition = OutputNested (Get-Content -Path $definitionFilePath -Raw | ConvertFrom-Json) $PropertyPath

$definition

Входной файл JSON:

{ 
    "stuff": {
        "onetype": [
            {"id":1,"name":"John Doe"},
            {"id":2,"name":"Don Joeh"}
        ],
        "othertype": {"id":2,"company":"ACME"}
    }, 
    "otherstuff": {
        "thing": [[1,42],[2,2]]
     }
}

Выход:

id name    
-- ----    
 1 John Doe
 2 Don Joeh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...