Создайте класс с динамическими именами свойств в 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 альтернативно определить класс без свойств и только метод (экземпляра), который заполняет / обновляет свойства данного экземпляра по требованию.

Другие вопросы по тегам