none
Чередование массива RRS feed

  • Вопрос

  • Имеются два массива, но их будет больше..
    Требуется выполнить скрипт с данными из одного массива 1, потом из другого 2, потом из 3...

    $bloks1 =  @(11, 12, 13, 14) 
    $bloks2 =  @(21,22)
    $i=1
    While ($i -le 2) {
    $bloks='$bloks'+$i
    Foreach ($blok1 in $bloks) {код}
    i++
    }
    В данном виде скрипт не выполняется, я так понимаю, что в bloks передается не массив уже, а просто переменная. Как можно у foreach менять массив после выполнения предыдущего.

    9 апреля 2020 г. 17:27

Ответы

  • День добрый.

    Возможно не понял задачу, но скорее всего можно воспользоваться Advanced Function

    $VerbosePreference = "Continue"
    
    function Work-WithArray {
        param (
            [Parameter(ValueFromPipeline)]
            [array]$array
        )
        begin {
            Write-Verbose "Begin block:"
            $count = 0
         }
    
        process {
            Write-Verbose "Process block:"
            Write-Verbose "Колличество элементов текущего массива = $($array.count)"
            for ($i = 0; $i -lt $array.Length; $i++) {
                Write-Host "Index = $i`t Value = $($array[$i])"
                $count++
            }
        }
        end {
            Write-Verbose "End block:"
            Write-Verbose "Колличество всех элементов массива = $count"
        }
    }
    
    
    $bloks1 = @(11, 12, 13, 14) 
    $bloks2 = @(21, 22)
    $bloks1, $bloks2,@(31,32,33) | Work-WithArray


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Предложено в качестве ответа Vector BCOModerator 10 апреля 2020 г. 10:33
    • Помечено в качестве ответа Vector BCOModerator 10 апреля 2020 г. 18:35
    9 апреля 2020 г. 18:53
  • вы эти массивы ($bloks1,$bloks2,...,$bloksN) будете руками создавать?

    $bloks1 =  @(11, 12, 13, 14) 
    $bloks2 =  @(21,22)
    1..2 | foreach {
       Write-Host "Block $_"
       $Values = Get-Variable "bloks$_"
       $i = 1
       foreach ($value in $values.Value){
          Write-Host "`t[Value#$i] $value"
          $i++
       }
    }

    Пример вывода:


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


    • Изменено Vector BCOModerator 9 апреля 2020 г. 18:18
    • Предложено в качестве ответа Vector BCOModerator 10 апреля 2020 г. 10:33
    • Помечено в качестве ответа RK3DNP 10 апреля 2020 г. 17:38
    9 апреля 2020 г. 18:15
    Модератор

Все ответы

  • вы эти массивы ($bloks1,$bloks2,...,$bloksN) будете руками создавать?

    $bloks1 =  @(11, 12, 13, 14) 
    $bloks2 =  @(21,22)
    1..2 | foreach {
       Write-Host "Block $_"
       $Values = Get-Variable "bloks$_"
       $i = 1
       foreach ($value in $values.Value){
          Write-Host "`t[Value#$i] $value"
          $i++
       }
    }

    Пример вывода:


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


    • Изменено Vector BCOModerator 9 апреля 2020 г. 18:18
    • Предложено в качестве ответа Vector BCOModerator 10 апреля 2020 г. 10:33
    • Помечено в качестве ответа RK3DNP 10 апреля 2020 г. 17:38
    9 апреля 2020 г. 18:15
    Модератор
  • Да, руками. Спасибо огромное, проверю, отпишусь.
    9 апреля 2020 г. 18:38
  • День добрый.

    Возможно не понял задачу, но скорее всего можно воспользоваться Advanced Function

    $VerbosePreference = "Continue"
    
    function Work-WithArray {
        param (
            [Parameter(ValueFromPipeline)]
            [array]$array
        )
        begin {
            Write-Verbose "Begin block:"
            $count = 0
         }
    
        process {
            Write-Verbose "Process block:"
            Write-Verbose "Колличество элементов текущего массива = $($array.count)"
            for ($i = 0; $i -lt $array.Length; $i++) {
                Write-Host "Index = $i`t Value = $($array[$i])"
                $count++
            }
        }
        end {
            Write-Verbose "End block:"
            Write-Verbose "Колличество всех элементов массива = $count"
        }
    }
    
    
    $bloks1 = @(11, 12, 13, 14) 
    $bloks2 = @(21, 22)
    $bloks1, $bloks2,@(31,32,33) | Work-WithArray


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Предложено в качестве ответа Vector BCOModerator 10 апреля 2020 г. 10:33
    • Помечено в качестве ответа Vector BCOModerator 10 апреля 2020 г. 18:35
    9 апреля 2020 г. 18:53
  • ну это я понял vbs, а я на powershell писал, решение  от Vector BCO мне помогло. Спасибо и за ваше решение.
    10 апреля 2020 г. 17:41
  • ну это я понял vbs, а я на powershell писал, решение  от Vector BCO мне помогло. Спасибо и за ваше решение.

    Решение Сергея это тоже PowerShell и работает похожим образом 

    подаете набор массивов, фукция берет массив и перебирает элементы

    при этом degin / end блоки выполняются только однажны перед всеми инпутами и после всех аутпутов

    в зависимости от того что будете делать дальше можно выбирать одно или другое решение или их миксы 


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

    10 апреля 2020 г. 18:35
    Модератор