我需要能够在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)
您可以使用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提出以下建议:不定义属性而仅定义类,而仅定义(实例)方法来按需填充/更新给定实例的属性。
| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |