Итак, я пишу функцию.Один из параметров функции, который я создал, называется 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
.