在powershell中创建一个具有动态属性名称的类

时间:2018-03-05 18:27:12

标签: powershell

我需要能够在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"
}

1 个答案:

答案 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建议选择性地定义没有属性的类,并且仅建议填充/更新给定实例的(实例)方法按需提供物业。