PowerShell中如何从Get-ChildItem输出变量移除随机选中项
错误原因
你使用的-replace操作符无法实现对象列表的条目移除,原因如下:
-replace是字符串正则替换操作符,仅作用于文本内容,无法识别Get-ChildItem返回的文件对象- 传入
$FourFiles作为替换参数时,PowerShell会自动将4个文件对象转成字符串拼接为一整段匹配文本,无法对应原列表中的独立文件条目,自然无法得到预期结果。
正确实现方案
Get-ChildItem返回的每个文件对象都有唯一的FullName(完整绝对路径)属性,可作为精准匹配的依据,通过Where-Object过滤掉已选中的4个文件即可,完整代码如下:
# 获取指定路径下匹配扩展名的文件列表 $FolderToOpen = Get-ChildItem -Path $SrcDir -Filter *.$ExtLst -File # 从列表中随机选取4个文件 $FourFiles = $FolderToOpen | Get-Random -Count 4 # 过滤掉已选中的4个文件,更新原列表变量 $FolderToOpen = $FolderToOpen | Where-Object { $_.FullName -notin $FourFiles.FullName }
注意事项:
Get-ChildItem的-Filter参数仅支持单个匹配规则,如果你的$ExtLst是多个扩展名组成的数组,原文件获取命令需要调整为多扩展名匹配写法,避免漏查文件:$FolderToOpen = Get-ChildItem -Path $SrcDir -Include ($ExtLst | ForEach-Object { "*.$_" }) -File命令中追加的
-File参数用于确保返回结果仅包含文件,不会混入同名子目录条目。
内容的提问来源于stack exchange,提问作者Yuuki
相关产品推荐
相关产品推荐

