【问题标题】:PSObject Array of Arrays Return Powershell Read Individual Items/RowsPSObject Array of Arrays 返回 Powershell 读取单个项目/行
【发布时间】:2017-09-18 17:53:14
【问题描述】:

我正在使用一个函数来调用另一个函数并返回一个 PSObject 数组或多个数组(我认为)。每个循环对象之后的返回是一组值。 Function Test2 中 $a 中的数据如下,但计数为 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)"}

提前致谢。

【问题讨论】:

    标签: arrays powershell psobject


    【解决方案1】:

    您正在创建的是一个包含三个元素的数组。数组中的每个元素都显示信息。当您将其写到控制台时,您会看到所有元素都挤在一起:

    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 的第一个元素,它是一个数组,然后访问该数组的第一个元素。您必须使用嵌套循环来访问嵌套数组中的每个元素。

    【讨论】:

    • 感谢杰森的解释。如此简单,我试图太花哨,但谢谢你让我直截了当。我已经使用以下代码对其进行了测试,并得到了结果。回答中的代码。
    【解决方案2】:

    感谢 Jason,我能够让代码正常工作。我在 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.
    

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2017-05-08
      相关资源
      最近更新 更多