PowerShell移动不在指定列表且早于本月的图片文件问题求助
解决PowerShell移动指定图片文件的问题
让我来帮你搞定这个脚本问题~
问题根源
你遇到的Collection was of a fixed size报错,本质是因为从文本文件读取的列表默认是固定长度的数组,而数组不支持Remove方法——只有ArrayList这类可变集合才允许修改。不过其实咱们完全可以绕开修改原列表的操作,直接通过筛选逻辑定位目标文件,这样既简洁又不会踩坑。
先再明确下你的核心需求:
- 要移动的文件得满足两个条件:一是文件名前缀不在给定的TXT列表里,二是修改时间早于本月
直接可用的解决方案脚本
下面是完全贴合你需求的PowerShell代码,已经避开了集合修改的坑:
# 1. 读取前缀列表,转成小写避免大小写匹配问题(适配你文件名的大小写混合情况) $prefixList = Get-Content -Path "你的列表文件路径.txt" | ForEach-Object { $_.Trim().ToLower() } # 2. 计算本月第一天的零点时间(用来判断文件是否早于本月修改) $startOfMonth = (Get-Date).Date.AddDays(-(Get-Date).Day + 1) # 3. 筛选符合条件的jpg文件 $filesToMove = Get-ChildItem -Path "你的图片文件夹路径" -Filter "*.jpg" | Where-Object { # 提取文件名里下划线之前的前缀,转小写 $filePrefix = $_.BaseName.Split('_')[0].ToLower() # 两个筛选条件:前缀不在列表里,且修改时间早于本月 (-not $prefixList.Contains($filePrefix)) -and ($_.LastWriteTime -lt $startOfMonth) } # 4. 执行移动操作(先加-WhatIf预览,确认没问题再删掉) if ($filesToMove.Count -gt 0) { $filesToMove | Move-Item -Destination "你的目标文件夹路径" -WhatIf } else { Write-Host "没有符合条件的文件需要移动哦" }
关键细节说明
- 大小写兼容:把列表和文件名前缀都转成小写,完美适配你文件名里的各种大小写混合情况(比如
puppy_B_W.jpg、shoe_col.jpg),不会因为大小写差异漏判。 - 时间判断准确:计算本月第一天的零点时间,只要文件最后修改时间在这个点之前,就符合"早于本月"的要求,逻辑精准。
- 避开集合修改坑:直接用
Where-Object筛选文件,根本不需要修改原前缀列表,从根源上避免了固定大小集合的报错。 - 安全预览:加上
-WhatIf参数可以先看到要移动的文件列表,确认没问题后再移除这个参数执行实际移动,避免误操作。
关于你之前的ArrayList尝试
如果之前转ArrayList没生效,大概率是转换方式不对,正确的转换应该是这样:
$prefixList = [System.Collections.ArrayList](Get-Content -Path "你的列表文件路径.txt")
不过还是推荐上面的解决方案,逻辑更清晰,也没必要折腾修改原列表。
内容的提问来源于stack exchange,提问作者jaramator
相关产品推荐
相关产品推荐

