因此,我正在编写一个函数。我创建的函数参数之一称为ObjectName
,我想使用它来允许用户指定该函数应该创建的PSObject的名称,并向其添加成员。新的PSObject应该以为此参数提供的任何字符串命名。
此函数的目的是从文件中读取一个字符串列表,这些文件的名称和值用:
分隔,然后用:
分隔字符串,并使用两个分隔字符串作为-Name
cmdlet的-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是按预期方式创建的(空的),因为我已经在shell中逐步完成了此操作。我认为Add-Member
用法确实是我需要解决方案的地方。
在这一点上,我确定我会采用错误的方式。我是否缺少明显的东西?欢迎任何反馈或想法。
编辑:在没有真正说明问题的情况下,我做了很多打字。如何使用参数输入指定的$ObjectName
作为Add-Member
的输入?我想向一个对象添加成员,但是直到调用函数时提供它,我才知道对象的名称是什么。我需要将$ObjectName
传递给Add-Member
的方式必须真正传递用户提供的对象名称,而不是“ ObjectName”而是$userSpecifiedObjectName
。
答案 0 :(得分:1)
不完全确定这是您要寻找的东西。但这会将“:”分隔的项(名称:John Doe)添加到您创建的PSObject中。在您的foreach
循环中,
(Get-Variable -name $ObjectName).Value | Add-Member -MemberType NoteProperty -Name $name -Value $value
您可以使用
引用该对象(Get-Variable -name $ObjectName).Value.Name
这是您要尝试做的吗?如果没有,您能再解释一下吗?