PowerShell删除满足条件的,修改时间早的文件
我的桌面上有一个文件夹A, 里面可能有 [color=#ff0000][b]1个 [/b][/color]或 [b][color=#0000ff]N个 [/color][/b]txt文件, 例如:有如下文件(注:有的文件名中[color=#ff0000]有空格[/color])流浪.txt
流浪2.txt
流浪 2.txt
流浪 2 .txt
流浪2 - 副本.txt
流浪2 - 副本 - 副本.txt
---------------------------------------------------------------------------------------------------------------
当有 [b][color=#ff0000]1个 [/color][/b]txt文件的时候: 只需要检查文件名是否带2, 然后将文件夹改名为 [b][color=#ff0000]流浪2.txt[/color][/b]
当有 [b][color=#0000ff]N个 [/color][/b]txt文件的时候: 先找到[b][color=#ff0000]文件名中带2[/color][/b]的txt文件, 然后从中删除修改时间早的文件, 留下修改时间最晚的, 最后将文件名改名为 [color=#ff0000][b]流浪2.txt[/b][/color][b][color=#ff0000]
[/color][/b]
[b][color=#ff0000]可能还有个特殊情况:[/color][color=#0000ff] 修改时间最晚, 但相同的[/color][/b][b][color=#0000ff]文件[/color][/b][b][color=#0000ff]有N个[/color][/b][b][color=#0000ff], 那就只取一个,其它删除[/color]
[/b]
下面的代码, 还没有添加 [b][color=#0000ff]删除那些修改时间早的文件 [/color][color=#000000]和[/color][color=#0000ff] [/color][color=#ff0000]特殊情况的处理[/color][/b] 的代码, 请求路过高手支招, 提前感谢![code]#&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
}[/code] [i=s] 本帖最后由 idwma 于 2022-4-11 14:04 编辑 [/i]
[code]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
}
[/code] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254113&ptid=62294]2#[/url] [i]idwma[/i] [/b]
最后下面这段代码, 会把文件夹A的名字改为 流浪2.txt 是不是应该改为 ren $f[0].[color=#ff0000]fullName[/color] $new
if($f -ne $null) 这个不太理解, 感觉是不是应该加上我前面的 if判断? 因为有时可能 没有符合条件的文件, 我是以数量来判断的
[code]if($f -ne $null){
cd ..
ren $f[0].DirectoryName $new
}[/code] 不改文件夹就删掉这段
用数组不用判断 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254117&ptid=62294]4#[/url] [i]idwma[/i] [/b]
大侠好, 如果不判断, 当文件夹内的文件名没有包含2的时候, 执行就会出错,
而用判断文件数量的方法, 又感觉有点啰嗦,有什么好的办法呢 [i=s] 本帖最后由 idwma 于 2022-4-11 20:13 编辑 [/i]
呃没想到这个情况
要灵活一点嘛,只用判断一下$f是不是空
放到改文件夹名那段里 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254128&ptid=62294]6#[/url] [i]idwma[/i] [/b]
感谢大侠指引, 现在应该完善了, 最后把文件里的空格也删了
[code]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
}[/code]
页:
[1]