Как обратиться к динамически именуемой переменной с переменной? - PullRequest
0 голосов
/ 10 июля 2019

Итак, я пишу функцию.Один из параметров функции, который я создал, называется ObjectName, и я хочу использовать его, чтобы позволить пользователю указать имя объекта PSObject, для которого должна создаваться функция, и добавить членов.Новый объект PSObject должен быть назван в честь любой строки, предоставленной для этого параметра.

Цель функции - прочитать список строк, которые из файла, имена и значения которого разделены :, разделяютсястроки : и использовать две разделенные строки в качестве ввода -Name и -Value для командлета Add-Member.

Вот пример того, как выглядит входной файл:

User creation report
name: John Doe
 startDate: 01/01/2019
 creationTime: 2019-01-01T18:29:56.954Z
department: Sales
 locale: 
  unit: 

Код:

function New-ObjectFromFile {

    param (
        # Specify input data from file containing employee data.
        [Parameter(
            Position            = 0,
            Mandatory           = $true,
            ValueFromPipeline   = $true,
            HelpMessage         = 'Input file required.'
        )]
        [ValidateNotNullOrEmpty()]
        [string]
        $File,
        # Specify name of object to be created.
        [Parameter(
            Position            = 1,
            Mandatory           = $true,
            ValueFromPipeline   = $false,
            HelpMessage         = 'Object name required. This will be the name of the PSObject this function creates.'
        )]
        [ValidateNotNullOrEmpty()]
        [string]
        $ObjectName
    )

    # Read data from -File param
    $inputData = Get-Content -Path $File
    # Remove empty lines and non-properties from array
    $inputData = $inputData | Where-Object {$_ -like '*:*'}
    # Create new empty PSObject named after -ObjectName param
    New-Variable -Name $ObjectName -Value $(New-Object -TypeName PSObject)
    # Add array items as members to object
    foreach ($line in $inputData) {
        # Split line, max string count of 2 in order to preserve values containing ':'
        $lineSplit = $line -split ':',2
        # Remove leading and trailing whitespace from name and value
        $name = $lineSplit[0].trim()
        $value = $lineSplit[1].trim()
        # Only add non-empty properties
        if ('' -ne $value) {
            $ObjectName | Add-Member -MemberType NoteProperty -Name $name -Value $value
        }
    }
}

Мне кажется, что для двух разных подходов может потребоваться другой подход - это строка New-Object -Name $ObjectData... (где объект PSObject создается несколько хакерским способом, чтобы использоватьимя объекта) и строку $ObjectName | Add-Member..., которая добавляет имя и значение каждой строки как NoteProperty к объекту.

Я пробовал несколько различных методов вместо использования Add-Member, указанного выше:

$($ObjectName.ToString()) | Add-Member -MemberType NoteProperty -Name $name -Value $value

В результате $providedName (имя, указанное для -ObjectName в вызове функции) все еще остается пустым объектом, лишенным каких-либо членов, кроме методов по умолчанию для PSObject (Equals, GetHashCode, GetType, ToString)

Add-Member -MemberType NoteProperty -Name $name -Value $value -InputObject $(Get-Variable -Name $ObjectName.ToString())

Тот же результат.

Add-Member -MemberType NoteProperty -Name $name -Value $value -InputObject $(Get-Variable -Name $($ObjectName.ToString()))

Тот же результат.

Я знаю, что PSObject создан (пустой), как и ожидалось, потому что я прошел черезэто в оболочке.Использование Add-Member - это то, где я думаю, что мне действительно нужно решение.

На данный момент я уверен, что поступаю неправильно.Я что-то упускаю из виду?Любые отзывы или идеи приветствуются.

РЕДАКТИРОВАТЬ: Я много печатал, не задавая вопроса.Как использовать $ObjectName, как указано параметром input, как вход для Add-Member?Я хочу добавить членов к объекту, но я не знаю, как называется объект, пока он не будет передан при вызове функции.Мне нужно передать $ObjectName в Add-Member таким образом, чтобы он действительно передавал имя объекта, предоставленное пользователем, не «ObjectName», а $userSpecifiedObjectName.

1 Ответ

1 голос
/ 10 июля 2019

Не совсем уверен, что это то, что вы ищете. Но это добавит разделенные ':' элементы (имя: Джон Доу) в PSObject, который вы создавали. В вашей foreach петле

(Get-Variable -name $ObjectName).Value | Add-Member -MemberType NoteProperty -Name $name -Value $value

Вы можете ссылаться на этот объект с помощью

(Get-Variable -name $ObjectName).Value.Name

Это то, что вы пытались сделать? Если нет, не могли бы вы объяснить немного больше?

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