从 `Get-ChildItem` 的输出中随机删除项目

3
我想问一个关于从 get-childitem 获得的字符串变量中删除行的问题。 现在,我使用以下代码提取指明文件的行: $FolderToOpen= Get-ChildItem -Path $SrcDir -Filter *.$ExtLst
它会获取指定文件夹和指定扩展名的文件。 然后,我从该变量中获取4行随机行: $FourFiles = $FolderToOpen | Get-Random -Count 4
但是,这就是我的问题,我想从第一个变量中删除这4行。但是,我无法做到这一点,例如执行以下操作: $FolderToOpen -replace "$FourFiles",""
却没有任何效果。请问有人能帮我解决这个问题吗? 先谢谢了 :)
4个回答

2

最简单的方法是利用Compare-Object,它可以逐个比较数组元素:

Compare-Object -ReferenceObject $FolderToOpen -DifferenceObject $FourFiles -PassThru

0
你的方法存在问题,因为PowerShell更喜欢操作对象而不是字符串Get-ChildItem的输出是一系列对象流,可以通过将其管道传递到Get-Member来证明:
PS> dir | Get-Member 
TypeName: System.IO.DirectoryInfo
...
TypeName: System.IO.FileInfo
...

由于您特别关注字符串过滤,您可以事先将所有对象转换为字符串,然后执行过滤:

$FourFiles = $FolderToOpen | Get-Random -Count 4 | % {$_.ToString()}
$FolderToOpen | Where {$_.ToString() -inotin $FourFiles}

请注意,$FolderToOpen 是一个字符串流,而不像在 Bash 中一样是一个大字符串。因此,我使用了 Where 来过滤条目。

谢谢,我通过使用一些collections.queue找到了一些解决方法,因为我能看到关于数组和字符串的一些内容,但是你的答案帮助我理解了一些东西:D - Yuuki

0

Get-ChildItem 命令默认返回一个对象数组,因此其大小是固定的(有关此信息的更多信息,请参见有关数组的所有内容

如果我们首先将 Get-ChildItem 调用的结果转换为列表,那么我们就可以添加和删除项目(无需创建新数组来保存更新后的数据)

下面的更新代码应该可以给你想要的结果:

# Call Get-ChildItem but store the results as a list of objects
# rather than a standard array of objects
[Collections.Generic.List[Object]]$FolderToOpen= Get-ChildItem -Path $SrcDir -Filter *.$ExtLst

# Get your random selection of 4 files
$FourFiles = $FolderToOpen | Get-Random -Count 4

# Remove them from the list 
$FolderToOpen.RemoveAll({ param($folder) $folder -in $FourFiles })

上面的RemoveAll函数将返回从列表中删除的条目总数(在本例中为4)。


谢谢,我通过使用一些collections.queue和dequeue找到了一些解决方法,但我更愿意使用您的解决方案,我认为它更加简洁 :D - Yuuki

0
一种只使用Get-Random的解决方案。基本上使用Get-Random选择要包括的文件,而不是排除它们。然后你就不需要删除任何东西了。 Get-Random的输出已经是你想要的结果。
$FolderToOpen = @(Get-ChildItem -Path $SrcDir -Filter *.$ExtLst)

$includeCount = $FolderToOpen.Count - 4
$FolderToOpen = if( $includeCount -gt 0 ) { 
    $FolderToOpen | Get-Random -Count $includeCount 
}
  • 为了确保我们始终从Get-ChildItem中获取一个数组,请使用数组子表达式运算符@()。否则,如果Get-ChildItem仅输出单个文件,则会得到单个对象。
  • if语句是必需的,以确保当Get-ChildItems返回四个或更少的文件时,我们不会传递无效的-Count参数给Get-Random
  • 请注意,这将以随机顺序输出文件,但您可以轻松地按路径对它们进行排序:
    $FolderToOpen | Get-Random -Count $includeCount | Sort-Object FullName
    

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