Создайте класс с динамическими именами свойств в 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 ответ
Ты можешь использовать Invoke-Expression
(решение - PSv5+, благодаря использованию пользовательских классов PS):
Invoke-Expression @"
Class myItem {
$((Get-ChildItem $files -Include *.BIN -recurse).ForEach({"[string] `${$($_.Name)}`n "}))
}
"@
Здесь-строка создает определение класса в виде строки, которая Invoke-Expression
затем оценивает, который определяет класс [myItem]
для последующего использования (например, $instance = [myItem]::new()
).
Обратите внимание, что определение класса заблокировано для этого сеанса во время вызова Invoke-Expression
, что удовлетворяет требованиям ОП (добавленные позже файлы не будут отражены в свойствах класса). [1]
Приведенная выше строка здесь выглядит примерно так: обратите внимание на необходимость заключать имена свойств в {...}
потому что они содержат .
:
Class myItem {
[string] ${File1.Bin}
[string] ${File2.Bin}
# ...
}
[1] Класс является неизменяемым после определения, хотя вы можете динамически добавлять свойства к его экземплярам, используя ETS (расширенную систему типов) PowerShell, обычно через Add-Member
Командлет.
Добавление свойств экземпляра по требованию позволило бы предложению TheMadTechnician альтернативно определить класс без свойств и только метод (экземпляра), который заполняет / обновляет свойства данного экземпляра по требованию.