从Arraylist中删除对象 Powershell

3
我想删除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

这种情况是否有可能发生,或者我使用了错误的解决方案。期待您提供任何提示或建议。
2个回答

1
我猜你这样做是为了得到需要创建的文件夹列表。尽管从ArrayList中删除是完全可能的,但在这种情况下你试图做的不是。据我所知,在对集合进行枚举时,您无法修改它。
之所以没有出现错误,是因为您使用了等号运算符-eq,如果需要在集合中查找元素,则需要使用包含运算符(在这种情况下为-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 ->

1
嗨,谢谢您的答案,非常有帮助。 - Chline Erfinoo
@ChlineErfinoo 很高兴能帮助你。 - Santiago Squarzon

0

你很接近了,只需要将 -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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接