#powershell #loops #object #foreach
#powershell #циклы #объект #foreach
Вопрос:
Я пытаюсь создать объект, используя цикл foreach в PowerShell. Пытался использовать цикл «while», он также потерпел неудачу. По-видимому, методы цикла не позволяют мне создавать объекты…
Без дальнейших церемоний…
У меня есть два скрипта — Class.psm1 и Main.ps1.
В Class.psm1
Class Car {
[string]$brand
[string]$model
[string]$color
#Constructor
Car ([string]$brand) {
$this.brand = $brand
switch -wildcard ($this.brand) {
('Toyota') {$this.model = 'ABC'; $this.color = 'red'; break}
('Honda') {$this.model = 'FGH'; $this.color = 'blue'; break}
}
}
}
И на Main.ps1
Using module ".Class.psm1"
$AllCars = {'Toyota', 'Honda'}
[array]$Objects = @()
foreach ($car in $AllCars) {
$temp = New-Object Car("$car")
$Objects = $temp
}
Вывод из Main.ps1 заключается в том, что $Objects просто возвращает обратно «Toyota» и «Honda» вместо объектов (и свойств, которые они должны иметь).
Однако, если бы я просто создал объект по отдельности, он будет работать нормально.
Например:
$temp = New-Object Car('Toyota')
$Objects = $temp
$temp = New-Object Car('Honda')
$Objects = $temp
Однако это слишком ручная работа или, скорее, непрактично.
Могу ли я узнать, в какой области коды пошли не так …? Как мне создать объекты внутри цикла?
Комментарии:
1. В
Class.psm1
есть куча синтаксических ошибок — все свойства и параметры должны$
указываться перед именем2. Привет, Джессен, извините, я ввел здесь вручную (поскольку все данные были составлены), но в кодах они близки к моим точным кодам с правильным синтаксисом и так далее. Спасибо, что заметили это, изменю это здесь.
3. Возможно, вы редактировали свой класс и пытались без перезапуска PowerShell? После загрузки изменения в нем не распознаются.
4. Привет, Тео .. да, ты прав. Каким-то образом именно файлу Class потребовался перезапуск. После этого все работает. Спасибо!
Ответ №1:
Эта проблема заключается в том, что вы используете {'Toyota', 'Honda'}
вместо ('Toyota', 'Honda')
{'Toyota', 'Honda'}
это блок кода. Когда вы передаете его в New-Object Car("$car")
, он фактически передает New-Object Car("'Toyota', 'Honda'")
$AllCars = ('Toyota', 'Honda')
[array]$Objects = @()
foreach ($car in $AllCars) {
$temp = New-Object Car("$car")
$Objects = $temp
}
Поскольку меня спросили, почему код kangaroo, я решил опубликовать более короткий ответ
$Objects = 'Toyota', 'Honda' | %{
New-Object Car("$car")
}
Комментарии:
1. Почему такой кенгурятный код? Просто используйте
$AllCars = ('Toyota', 'Honda'); <#PleaseTypeANewLineHere#>; $Objects = foreach ($car in $AllCars) { New-Object Car($car) }
2. Я использовал его код выше и просто изменил одну строку. Я не написал ничего другого, чем то, что у него было, а затем заменил
{}
на()
. Итак, если вы хотите спросить о коде kangaroo, обратитесь к постеру.3. Я бы тоже опустил скобки, вам просто нужно
$AllCars = 'Toyota', 'Honda'
объявить массив строк.4. Прошу прощения за мою оскорбительную формулировку. Мой скудный словарный запас перевел это как ‘слишком сложный код’ без какого-либо грубого или оскорбительного оттенка. Извините.
5. @JosefZ Без проблем, извините, что неправильно понял 🙂