批处理之家's Archiver

5i365 发表于 2022-4-11 07:35

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]

idwma 发表于 2022-4-11 13:55

[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]

5i365 发表于 2022-4-11 15:18

[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]

idwma 发表于 2022-4-11 15:34

不改文件夹就删掉这段
用数组不用判断

5i365 发表于 2022-4-11 19:53

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254117&ptid=62294]4#[/url] [i]idwma[/i] [/b]


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

idwma 发表于 2022-4-11 20:09

[i=s] 本帖最后由 idwma 于 2022-4-11 20:13 编辑 [/i]

呃没想到这个情况
要灵活一点嘛,只用判断一下$f是不是空
放到改文件夹名那段里

5i365 发表于 2022-4-11 20:29

[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]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.