You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 "没有符合条件的文件需要移动哦"
}

关键细节说明

  1. 大小写兼容:把列表和文件名前缀都转成小写,完美适配你文件名里的各种大小写混合情况(比如puppy_B_W.jpg、shoe_col.jpg),不会因为大小写差异漏判。
  2. 时间判断准确:计算本月第一天的零点时间,只要文件最后修改时间在这个点之前,就符合"早于本月"的要求,逻辑精准。
  3. 避开集合修改坑:直接用Where-Object筛选文件,根本不需要修改原前缀列表,从根源上避免了固定大小集合的报错。
  4. 安全预览:加上-WhatIf参数可以先看到要移动的文件列表,确认没问题后再移除这个参数执行实际移动,避免误操作。

关于你之前的ArrayList尝试

如果之前转ArrayList没生效,大概率是转换方式不对,正确的转换应该是这样:

$prefixList = [System.Collections.ArrayList](Get-Content -Path "你的列表文件路径.txt")

不过还是推荐上面的解决方案,逻辑更清晰,也没必要折腾修改原列表。

内容的提问来源于stack exchange,提问作者jaramator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:22:22