代码之家  ›  专栏  ›  技术社区  ›  Nakious

PSObject数组返回Powershell读取单个项/行

  •  4
  • Nakious  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  2
  •   Jason Snell    7 年前

    您要创建的是一个包含三个元素的数组。数组中的每个元素都在显示信息。当你把它写在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的第一个元素,即数组,然后访问该数组的第一个元素。您必须使用嵌套循环来访问嵌套数组中的每个元素。

        2
  •  0
  •   Nakious    7 年前

    多亏了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.