【问题标题】:Remove Object from Arraylist Powershell从 Arraylist Powershell 中删除对象
【发布时间】:2022-01-10 15:54:45
【问题描述】:

我想删除 Arraylist 中的对象。由于我是 Powershell 新手,我发现自己遇到了很多麻烦。

更具体地说,我想删除第一个 Arraylist 中的对象,如果该对象与第二个 Arraylist 中的对象相同,则应将其删除。

这是我到目前为止所尝试的。作为参考,我尝试使用此页面:https://www.sapien.com/blog/2014/11/18/removing-objects-from-arrays-in-powershell/

[System.Collections.ArrayList]$everyExistingFolder = (Get-ChildItem -Path "$PSScriptRoot\test" | foreach { $_.Name })

[System.Collections.ArrayList]$everyFolderWichShouldExist = (Get-Content "$PSScriptRoot\directoriesADExport.txt")





$output = ForEach ($element in $everyExistingFolder)
{
   if($element -eq $everyFolderWichShouldExist){
   
   $everyExistingFolder.Remove($element)
   
   }
   
}


 Out-File $output

这是可能的,还是我尝试了错误的解决方案。

很想听听任何提示或建议。

【问题讨论】:

    标签: powershell arraylist


    【解决方案1】:

    我假设您这样做是为了获取需要创建的文件夹列表。尽管 ArrayList 中删除是完全可能的,但在这种情况下您尝试做的事情不是。据我所知,您不能在枚举时修改集合。

    您没有收到任何错误的原因是因为您使用了相等运算符-eq,如果您需要在集合中查找元素,则需要使用containment operator 代替(-in-contains 在这种情况下)。

    如果代码正确,以下是重现异常的步骤:

    using namespace System.IO
    using namespace System.Collections
    
    $foldersExisting = 'Folder1', 'Folder2', 'Folder3', 'Folder4', 'Folder5'
    $foldersFromFile = 'Folder2', 'Folder4', 'Folder6', 'Folder7'
    
    [ArrayList]$listExisting = [FileInfo[]]$foldersExisting
    [ArrayList]$listFromFile = [FileInfo[]]$foldersFromFile
    
    foreach($folder in $listExisting)
    {
        if($folder.Name -in $listFromFile.Name)
        {
            $listExisting.Remove($folder)
        }
    }
    

    上面的代码会抛出以下异常:

    集合已修改;枚举操作可能无法执行。

    至于你想要完成的事情($everyExistingFolder 应该包含那些在$everyFolderWichShouldExist没有的元素),你应该根据第二个数组的元素过滤第一个数组数组:

    PS/> $foldersExisting.where({ $_ -notin $foldersFromFile })
    
    Folder1
    Folder3
    Folder5
    

    如果您确实需要从第一个集合中删除项目,您可以这样做,首先过滤要删除的元素,然后循环遍历它们。这样做的结果将与上面显示的过滤技术相同。

    foreach($folder in $listExisting.Where({ $_.Name -in $listFromFile.Name }))
    {
        $listExisting.Remove($folder)
    }
    
    PS /> $listExisting
    
    UnixMode   User   Group      LastWriteTime   Size Name
    --------   ----   -----      -------------   ---- ----
                              12/31/1600 20:07        Folder1 -> 
                              12/31/1600 20:07        Folder3 -> 
                              12/31/1600 20:07        Folder5 ->
    

    【讨论】:

    • 您好,感谢您的回答,这对您有很大帮助。
    • @ChlineErfinoo 我很高兴。乐于助人
    【解决方案2】:

    你已经接近了,你只需要将 -Eq 运算符替换为 -Contains-In 等数组运算符之一

    [System.Collections.ArrayList]$everyExistingFolder = (Get-ChildItem -Path "$PSScriptRoot\test" | foreach { $_.Name })
    
    [System.Collections.ArrayList]$everyFolderWichShouldExist = (Get-Content "$PSScriptRoot\directoriesADExport.txt")
    
    
    $output = ForEach ($element in $everyExistingFolder)
    {
       if($everyFolderWichShouldExist -contains $element){
          "need to remove $($element) from the array `everyExistingFolder"
          $everyExistingFolder.Remove($element)
       }  
    }
    
    Out-File $output
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 2015-08-02
      • 1970-01-01
      • 2015-08-05
      • 2013-04-17
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多