PSObject Массив массивов Возврат Powershell Прочитанные отдельные элементы / строки

Я использую одну функцию для вызова другой и возвращаю массив PSObject или несколько массивов (я думаю). Возврат после каждого зацикленного объекта - это набор значений. Данные в $ a в Function Test2 ниже, но их количество равно 3, что означает три объекта или массива, по одному для каждой папки. Это кажется довольно нормальным, и если бы я записал его в CSV для отчета, я был бы в порядке, но я хочу манипулировать данными в каждом массиве. Когда я пытаюсь манипулировать данными, он пытается манипулировать массивами, и я не могу искать или использовать элементы в каждой строке. Я также не знаю, сколько у меня папок, поэтому решение должно быть универсальным и расширяемым. Я не знаю, как легко получить доступ к каждой строке во всех массивах.

Function Test1 {
 [cmdletbinding()]
param(
    [Parameter(Position = 0, Mandatory = $true)]
    [string]$Folder
)

$array1 = @("Folder1_Test1","Folder1_Test2","Folder1_Test3","Folder1_Test4","Folder1_Test5    ","Folder2_Test6","Folder2_Test7","Folder2_Test8","Folder2_Test9","Folder3_Test1    0")
$array2 = @("Folder1_Test1","Folder1_Test4","Folder1_Test5","Folder2_Test9")


$data = @()
Foreach ($item in $array1) {
    If ($item -match $Folder -and $array2 -notcontains $item) {
        $Obj = New-Object PSObject -Property @{
            Folder = $Folder;
            SubFolder = $item;
            Message = "$item not found.";
        }
        $data += $Obj
}
}
Return ,$data
}

Function Test2 {
$Folders = @("Folder1", "Folder2", "Folder3")
$a = $Folders | ForEach-Object {Test1 $_}
$a.Count

foreach ($item in $a)
        { 
          $item.Folder
          $item.SubFolder
          $item.Message
        }
}

Выход $ a, однако, равен 3.

SubFolder      Message                   Folder 
---------      -------                   ------ 
Folder1_Test2  Folder1_Test2 not found.  Folder1
Folder1_Test3  Folder1_Test3 not found.  Folder1
Folder2_Test6  Folder2_Test6 not found.  Folder2
Folder2_Test7  Folder2_Test7 not found.  Folder2
Folder2_Test8  Folder2_Test8 not found.  Folder2
Folder3_Test10 Folder3_Test10 not found. Folder3

Как я могу получить доступ к каждой строке внутри каждого объекта? Я хочу иметь возможность искать в подпапке, а затем определять папку, в которой она находится, и писать сообщение, примерно так:

$a | ForEach-Object | Write-Host {"Subfolder $($_.Subfolder) is in $($_.Folder) and error message is $($_.Message)"}

Заранее спасибо.


person Nakious    schedule 18.09.2017    source источник


Ответы (2)


Вы создаете массив из трех элементов. Каждый элемент в массиве отображает информацию. Когда вы записываете это в conosole, вы видите, что все элементы собраны вместе:

SubFolder          Message                       Folder 
---------          -------                       ------ 
Folder1_Test2      Folder1_Test2 not found.      Folder1
Folder1_Test3      Folder1_Test3 not found.      Folder1
Folder1_Test5      Folder1_Test5     not found.  Folder1
Folder2_Test6      Folder2_Test6 not found.      Folder2
Folder2_Test7      Folder2_Test7 not found.      Folder2
Folder2_Test8      Folder2_Test8 not found.      Folder2
Folder3_Test1    0 Folder3_Test1    0 not found. Folder3

Если вы посмотрите на $ a [0], вы увидите следующее:

PS C:\WINDOWS\system32> $a[0]

SubFolder         Message                      Folder 
---------         -------                      ------ 
Folder1_Test2     Folder1_Test2 not found.     Folder1
Folder1_Test3     Folder1_Test3 not found.     Folder1
Folder1_Test5     Folder1_Test5     not found. Folder1

Вот почему счетчик возвращает 3. Если вы используете $a[0][0], вы увидите одну строку, поскольку она обращается к первому элементу $ a, который является массивом, а затем обращается к первому элементу этого массива. Вам нужно будет использовать цикл вложенности для доступа к каждому элементу вложенных массивов.

person Jason Snell    schedule 18.09.2017
comment
Спасибо за объяснение, Джейсон. Настолько просто, что я пытался быть слишком навороченным, но спасибо, что вы меня поправили. Я протестировал его с помощью следующего кода и получил свои результаты. Код в ответ. - person Nakious; 18.09.2017

Благодаря Джейсону мне удалось заставить код работать. Я добавил это в конец Test2, и результат ниже, строка за строкой.

Foreach ($Element in $a) {
   ForEach ($item in $Element) {
       Write-Host "Subfolder $($item.Subfolder) is in $($item.Folder) and 
error message is $($item.FolderMessage)"
   }


Subfolder Folder1_Test2 is in Folder1 and error message is Folder1_Test2 not found.
Subfolder Folder1_Test3 is in Folder1 and error message is Folder1_Test3 not found.
Subfolder Folder2_Test6 is in Folder2 and error message is Folder2_Test6 not found.
Subfolder Folder2_Test7 is in Folder2 and error message is Folder2_Test7 not found.
Subfolder Folder2_Test8 is in Folder2 and error message is Folder2_Test8 not found.
Subfolder Folder3_Test10 is in Folder3 and error message is Folder3_Test10 not found.
person Nakious    schedule 18.09.2017