Board logo

标题: [问题求助] PowerShell删除满足条件的,修改时间早的文件 [打印本页]

作者: 5i365    时间: 2022-4-11 07:35     标题: PowerShell删除满足条件的,修改时间早的文件

我的桌面上有一个文件夹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. }
复制代码

作者: idwma    时间: 2022-4-11 13:55

本帖最后由 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. }
复制代码

作者: 5i365    时间: 2022-4-11 15:18

回复 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. }
复制代码

作者: idwma    时间: 2022-4-11 15:34

不改文件夹就删掉这段
用数组不用判断
作者: 5i365    时间: 2022-4-11 19:53

回复 4# idwma


大侠好, 如果不判断, 当文件夹内的文件名没有包含2的时候, 执行就会出错,
而用判断文件数量的方法, 又感觉有点啰嗦,有什么好的办法呢
作者: idwma    时间: 2022-4-11 20:09

本帖最后由 idwma 于 2022-4-11 20:13 编辑

呃没想到这个情况
要灵活一点嘛,只用判断一下$f是不是空
放到改文件夹名那段里
作者: 5i365    时间: 2022-4-11 20:29

回复 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. $late = $f[0]
  12. ren $late $new
  13. (gc $new -Encoding UTF8) -replace '\s+' | Out-File $new -Encoding UTF8
  14. }
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2