none
Вывод массива в цикле FOR RRS feed

  • Вопрос

  • Коллеги, пишу скрипт по выводу характеристик ПК. Остановился на оперативке, т.к. оперативок много написал цикл по очередному выводу, но помечу-то имя производителя оперативки не выводится полностью, а только первый символ.

    #-----------| Memory RAM |----------#
    
    $RamMn = (Get-WmiObject -Class "Win32_PhysicalMemory" | Select-Object -Property Manufacturer).Manufacturer
    
    $RamSp = (Get-WmiObject -Class "Win32_PhysicalMemory" | Select-Object -Property Speed).Speed
    
    $RamCp = (Get-WmiObject -Class "Win32_PhysicalMemory" | Select-Object  @{Name="Capacity"; Expression={$_.Capacity/1GB}}).Capacity
    
    #-----------------------------------#
    
    for ([int]$i = 0;      $i -lt $RamMn.count;      $i++ )
    { 
          Write-Host "Manufactur: " -NoNewline
            Write-Host $RamMn[$i] -ForegroundColor Green
          
          Write-Host "Capacity: " -NoNewline
            Write-Host  $RamCp[$i] "Gb" -ForegroundColor Green
          
          Write-Host "Speed: " -NoNewline
            Write-Host $RamSp[$i] -ForegroundColor Green
          
          Write-Host # for the space
    }
    

    На выводе получаю:

    Manufactur: S
    Capacity:   4 Gb
    Speed:      1600

    А должно быть:

    Manufactur: Samsung
    Capacity:   4 Gb
    Speed:      1600
    Что делаю не так и чего не знаю? Спасибо.


    12 октября 2020 г. 7:30

Ответы

  • примеры смотрели? то что вы делаете это гиблый подход.

    Я знаю об этом. Я форматирую весь вывод write-host. Но речь не об этом, мне нужно понять почему в цикле имя не выводиться полное имя, а только первый символ?

    зачем сознательно делать так как делать не нужно?

    если у вас массив из 2 и более элементов то обратившись к массиву по индексу вы получите элемент массива. Если же обратиться к строке по индексу то получите символ с этим индексом.

    будь у вас 2 или более планок - получите Samsung, а в случае если она только одна получите S


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа ByBash88 12 октября 2020 г. 8:17
    12 октября 2020 г. 8:11
    Модератор
  • Теперь понятно ) Спасибо огромное, помогли. Дальше знаю что делать. 

    если хотите страдать и перебирать элементы по одному то foreach ваш вариант

    Get-WmiObject -Class "Win32_PhysicalMemory" | Select-Object Manufacturer, @{Name="Capacity"; Expression={"$($_.Capacity/1GB) GB"}}, Speed | foreach {

    write-host "Производитель: $($_.manufacturer)"

    write-host "Обьем планки: $($_.Capacity)

    }

    for в PowerShell нет частой необходимости использовать


    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Vector BCOModerator 12 октября 2020 г. 9:07
    • Помечено в качестве ответа Vector BCOModerator 18 октября 2020 г. 19:47
    12 октября 2020 г. 8:32
    Модератор

Все ответы

  • примеры смотрели? то что вы делаете это гиблый подход. Вы получаете результат вывода "Samsung"[0]

    по нормальному решается в одну строку

    Get-WmiObject -Class "Win32_PhysicalMemory" | Select-Object  Manufacturer, @{Name="Capacity"; Expression={"$($_.Capacity/1GB) GB"}}, Speed
    


    The opinion expressed by me is not an official position of Microsoft


    12 октября 2020 г. 7:47
    Модератор
  • примеры смотрели? то что вы делаете это гиблый подход.

    Я знаю об этом. Я форматирую весь вывод write-host. Но речь не об этом, мне нужно понять почему в цикле имя не выводиться полное имя, а только первый символ?
    12 октября 2020 г. 7:57
  • примеры смотрели? то что вы делаете это гиблый подход.

    Я знаю об этом. Я форматирую весь вывод write-host. Но речь не об этом, мне нужно понять почему в цикле имя не выводиться полное имя, а только первый символ?

    зачем сознательно делать так как делать не нужно?

    если у вас массив из 2 и более элементов то обратившись к массиву по индексу вы получите элемент массива. Если же обратиться к строке по индексу то получите символ с этим индексом.

    будь у вас 2 или более планок - получите Samsung, а в случае если она только одна получите S


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа ByBash88 12 октября 2020 г. 8:17
    12 октября 2020 г. 8:11
    Модератор
  • если у вас массив из 2 и более элементов то обратившись к массиву по индексу вы получите элемент массива. Если же обратиться к строке по индексу то получите символ с этим индексом.

    будь у вас 2 или более планок - получите Samsung, а в случае если она только одна получите S

    Теперь понятно ) Спасибо огромное, помогли. Дальше знаю что делать.


    12 октября 2020 г. 8:17
  • Теперь понятно ) Спасибо огромное, помогли. Дальше знаю что делать. 

    если хотите страдать и перебирать элементы по одному то foreach ваш вариант

    Get-WmiObject -Class "Win32_PhysicalMemory" | Select-Object Manufacturer, @{Name="Capacity"; Expression={"$($_.Capacity/1GB) GB"}}, Speed | foreach {

    write-host "Производитель: $($_.manufacturer)"

    write-host "Обьем планки: $($_.Capacity)

    }

    for в PowerShell нет частой необходимости использовать


    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Vector BCOModerator 12 октября 2020 г. 9:07
    • Помечено в качестве ответа Vector BCOModerator 18 октября 2020 г. 19:47
    12 октября 2020 г. 8:32
    Модератор