找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15300|回复: 6

[问题求助] PowerShell删除满足条件的,修改时间早的文件

[复制链接]
发表于 2022-4-11 07:35:04 | 显示全部楼层 |阅读模式
我的桌面上有一个文件夹A, 里面可能有 1个 N个 txt文件, 例如:有如下文件(注:有的文件名中有空格)
流浪.txt
流浪2.txt
流浪  2.txt
流浪  2  .txt
流浪2 - 副本.txt
流浪2 - 副本 - 副本.txt
---------------------------------------------------------------------------------------------------------------
当有 1个 txt文件的时候: 只需要检查文件名是否带2, 然后将文件夹改名为 流浪2.txt

当有 N个 txt文件的时候: 先找到文件名中带2的txt文件, 然后从中删除修改时间早的文件, 留下修改时间最晚的, 最后将文件名改名为 流浪2.txt

可能还有个特殊情况: 修改时间最晚, 但相同的文件有N个, 那就只取一个,其它删除

下面的代码, 还没有添加 删除那些修改时间早的文件 特殊情况的处理 的代码, 请求路过高手支招, 提前感谢!
  1. #&cls&@cd /d "%~dp0" & powershell -c "$cur_dir='%~dp0';Get-Content '%~0' | Out-String | Invoke-Expression" &pause&exit

  2. cd "$HOME\Desktop\A"
  3. $old = "流浪"
  4. $new = $old + "2.txt"

  5. #当符合条件的文件只有1个
  6. if ((gci $old*2*.txt).Count -eq 1)
  7. {
  8.         ren (gci $old*2*.txt).fullname $new
  9. }

  10. #当符合条件的文件有N个
  11. if ((gci $old*2*.txt).Count -gt 1)
  12. {
  13.         #Todo 删除修改时间早的文件
  14.         #----------------------------------------
  15.         
  16.         #找到修改时间最晚的文件
  17.         $f = (gci $old*2*.txt | sort LastWriteTime -Descending)[0]
  18.         
  19.         #将修改时间最晚的文件重命名
  20.         ren $f.fullname $new
  21. }
复制代码
发表于 2022-4-11 13:55:22 | 显示全部楼层
本帖最后由 idwma 于 2022-4-11 14:04 编辑
  1. cd "$HOME\Desktop\A"
  2. $old = "流浪"
  3. $new = $old + "2.txt"

  4.         #找到修改时间最晚的文件
  5.         [array]$f = gci $old*2*.txt | sort LastWriteTime -Descending

  6.         #Todo 删除修改时间早的文件
  7.         #----------------------------------------
  8.         $f[1..$f.Count]|del

  9.         #将修改时间最晚的文件重命名
  10.         ren $f[0].fullname $new

  11. if($f -ne $null){
  12. cd ..
  13. ren $f[0].DirectoryName $new
  14. }
复制代码
 楼主| 发表于 2022-4-11 15:18:57 | 显示全部楼层
回复 2# idwma
最后下面这段代码, 会把文件夹A的名字改为   流浪2.txt   是不是应该改为 ren $f[0].fullName $new
if($f -ne $null) 这个不太理解, 感觉是不是应该加上我前面的  if判断?  因为有时可能   没有符合条件的文件, 我是以数量来判断的


  
  1. if($f -ne $null){
  2. cd ..
  3. ren $f[0].DirectoryName $new
  4. }
复制代码
发表于 2022-4-11 15:34:53 | 显示全部楼层
不改文件夹就删掉这段
用数组不用判断
 楼主| 发表于 2022-4-11 19:53:25 | 显示全部楼层
回复 4# idwma


大侠好, 如果不判断, 当文件夹内的文件名没有包含2的时候, 执行就会出错,
而用判断文件数量的方法, 又感觉有点啰嗦,有什么好的办法呢
发表于 2022-4-11 20:09:54 | 显示全部楼层
本帖最后由 idwma 于 2022-4-11 20:13 编辑

呃没想到这个情况
要灵活一点嘛,只用判断一下$f是不是空
放到改文件夹名那段里
 楼主| 发表于 2022-4-11 20:29:58 | 显示全部楼层
回复 6# idwma


   感谢大侠指引, 现在应该完善了, 最后把文件里的空格也删了
  1. cd "$HOME\Desktop\A"
  2. $old = "流浪"
  3. $new = $old + "2.txt"

  4. #找到修改时间最晚的文件存到数组
  5. [array]$f = gci $old*2*.txt | sort LastWriteTime -Descending

  6. if ($f -ne $null)
  7. {
  8.         #删除修改时间早的文件
  9.         $f[1 .. $f.Count] | del
  10.        
  11.         #将修改时间最晚的文件重命名
  12.         $late = $f[0]
  13.         ren $late $new
  14.        
  15.         (gc $new -Encoding UTF8) -replace '\s+' | Out-File $new -Encoding UTF8
  16. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:08 , Processed in 0.017335 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表