标题: [问题求助] 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个, 那就只取一个,其它删除
下面的代码, 还没有添加 删除那些修改时间早的文件 和 特殊情况的处理 的代码, 请求路过高手支招, 提前感谢!- #&cls&@cd /d "%~dp0" & powershell -c "$cur_dir='%~dp0';Get-Content '%~0' | Out-String | Invoke-Expression" &pause&exit
-
- cd "$HOME\Desktop\A"
- $old = "流浪"
- $new = $old + "2.txt"
-
- #当符合条件的文件只有1个
- if ((gci $old*2*.txt).Count -eq 1)
- {
- ren (gci $old*2*.txt).fullname $new
- }
-
- #当符合条件的文件有N个
- if ((gci $old*2*.txt).Count -gt 1)
- {
- #Todo 删除修改时间早的文件
- #----------------------------------------
-
- #找到修改时间最晚的文件
- $f = (gci $old*2*.txt | sort LastWriteTime -Descending)[0]
-
- #将修改时间最晚的文件重命名
- ren $f.fullname $new
- }
复制代码
作者: idwma 时间: 2022-4-11 13:55
本帖最后由 idwma 于 2022-4-11 14:04 编辑
- cd "$HOME\Desktop\A"
- $old = "流浪"
- $new = $old + "2.txt"
-
- #找到修改时间最晚的文件
- [array]$f = gci $old*2*.txt | sort LastWriteTime -Descending
-
- #Todo 删除修改时间早的文件
- #----------------------------------------
- $f[1..$f.Count]|del
-
- #将修改时间最晚的文件重命名
- ren $f[0].fullname $new
-
- if($f -ne $null){
- cd ..
- ren $f[0].DirectoryName $new
- }
复制代码
作者: 5i365 时间: 2022-4-11 15:18
回复 2# idwma
最后下面这段代码, 会把文件夹A的名字改为 流浪2.txt 是不是应该改为 ren $f[0].fullName $new
if($f -ne $null) 这个不太理解, 感觉是不是应该加上我前面的 if判断? 因为有时可能 没有符合条件的文件, 我是以数量来判断的
- if($f -ne $null){
- cd ..
- ren $f[0].DirectoryName $new
- }
复制代码
作者: 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
感谢大侠指引, 现在应该完善了, 最后把文件里的空格也删了
- cd "$HOME\Desktop\A"
- $old = "流浪"
- $new = $old + "2.txt"
-
- #找到修改时间最晚的文件存到数组
- [array]$f = gci $old*2*.txt | sort LastWriteTime -Descending
-
- if ($f -ne $null)
- {
- #删除修改时间早的文件
- $f[1 .. $f.Count] | del
-
- #将修改时间最晚的文件重命名
- $late = $f[0]
- ren $late $new
-
- (gc $new -Encoding UTF8) -replace '\s+' | Out-File $new -Encoding UTF8
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |