我需要能够在powershell中创建一个类,我可以动态地创建该类属性的名称。例如,
$binFiles = Get-ChildItem $files -Include *.BIN -recurse
$binFiles.Name
这会打印出如下内容:
File1.BIN
ThisFile.BIN
...
FileOther.BIN
我希望这些文件名是我将多次创建的类中属性的名称。这甚至可能吗?
Class myItem {
[String]$"File1.BIN"
[String]$"ThisFile.BIN"
....
[String]$"FileOther.BIN"
}
答案 0 :(得分:5)
您可以使用Invoke-Expression
(由于使用自定义PS类,解决方案是PSv5 +):
Invoke-Expression @"
Class myItem {
$((Get-ChildItem $files -Include *.BIN -recurse).ForEach({"[string] `${$($_.Name)}`n "}))
}
"@
here-string将类定义生成为 string ,然后Invoke-Expression
进行评估,定义类[myItem]
供以后使用(例如$instance = [myItem]::new()
)。
请注意,在您调用Invoke-Expression
时,此会话的已锁定 ,这符合OP的要求(稍后添加的文件将不反映在类'属性中。 [1]
上面生成的here-string看起来像这样 - 请注意需要在{...}
中包含属性名称,因为它们包含.
:
Class myItem {
[string] ${File1.Bin}
[string] ${File2.Bin}
# ...
}
[1] 类一旦定义就是不可变的,尽管您可以使用PowerShell的ETS(扩展类型系统)动态地向其实例添加属性),通常通过Add-Member
cmdlet
按需添加实例属性将启用TheMadTechnician建议选择性地定义没有属性的类,并且仅建议填充/更新给定实例的(实例)方法按需提供物业。