在Powershell中创建具有动态属性名称的类

Hee*_*yon 6 powershell

我需要能够在Powershell中创建一个类,在其中可以动态创建该类的属性名称。例如,

$binFiles = Get-ChildItem $files -Include *.BIN -recurse
$binFiles.Name
Run Code Online (Sandbox Code Playgroud)

这将打印如下内容:

File1.BIN

ThisFile.BIN

...

FileOther.BIN

我希望这些文件名成为我将多次创建的类中属性的名称。这有可能吗?

Class myItem {
    [String]$"File1.BIN"
    [String]$"ThisFile.BIN"
    ....
    [String]$"FileOther.BIN"
}
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

您可以使用Invoke-Expression(由于使用自定义PS类,因此解决方案是PSv5 +):

Invoke-Expression @"
Class myItem {
  $((Get-ChildItem $files -Include *.BIN -recurse).ForEach({"[string] `${$($_.Name)}`n "}))
}
"@
Run Code Online (Sandbox Code Playgroud)

注意:虽然的这种特殊用法Invoke-Expression是安全的,但由于应完全控制要评估的字符串,Invoke-Expression因此通常应避免

此处的字符串将类定义生成为字符串Invoke-Expression然后进行评估,该字符串定义了类[myItem]供以后使用(例如$instance = [myItem]::new())。

请注意,在您调用时,此会话的类定义已锁定Invoke-Expression,这满足了OP的要求(以后添加的文件将不会反映在类的属性中)。[1]

上面产生的here-string看起来像这样-请注意需要将属性名称括在中{...},因为它们包含.

Class myItem {

  [string] ${File1.Bin}
  [string] ${File2.Bin}
  # ...

}
Run Code Online (Sandbox Code Playgroud)

[1] 该类一旦定义便是不可变的,尽管您通常可以通过cmdlet 使用PowerShell的ETS(扩展类型系统)向其实例动态添加属性Add-Member。按需
添加实例属性将使TheMadTechnician提出以下建议:不定义属性而仅定义类,而仅定义(实例)方法来按需填充/更新给定实例的属性。