Не удается создать объект в цикле Foreach в PowerShell

#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 Без проблем, извините, что неправильно понял 🙂