PSObject Array of Arrays Возвращение 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)"}
Заранее спасибо.
2 ответа
То, что вы создаете - это массив из трех элементов. Каждый элемент в массиве отображает информацию. Когда вы записываете это в консоль, вы видите, что все элементы собраны воедино:
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, который является массивом, а затем обращается к первому элементу этого массива. Вы должны будете использовать вложенный цикл для доступа к каждому элементу во вложенных массивах.
Благодаря Джейсону я смог заставить код работать. Я добавил это в нижней части 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.