查找具有特定扩展名的所有文件,按创建时间对它们进行排序,然后使用新名称复制它们

Find all files with a particular extension, sorting them by creation time and copy them with a new name

提问人:Marcos Camargo 提问时间:11/22/2022 最后编辑:ItchydonMarcos Camargo 更新时间:12/1/2022 访问量:372

问:

我试图递归地查找扩展名为 .raw 的所有文件,然后按 CreationTime 的升序对它们进行排序。之后,我想将每个文件复制到一个新目录,其中名称IMG_001_0001.jpg...IMG_001_0099.jpg我按升序使用 4 位数字的地方。重要的是,文件名 IMG_001_0001.jpg 是第一个创建的文件,如果有 99 个文件,则 IMG_001_0099.jpg 是最后一个创建的文件。

我试过了这个:

Get-ChildItem 'F:\Downloads\raw-20221121T200702Z-001.zip' -Recurse -include *.raw | Sort-Object CreationTime | ForEach-Object {copy $_.FullName F:\Downloads\raw-20221121T200702Z-001.zip/test/IMG_001_$($_.ReadCount).jpg}
PowerShell

评论


答:

2赞 Santiago Squarzon 11/22/2022 #1

如果我理解正确,你可以这样做:

$count = @{ Value = 0 }
Get-ChildItem 'F:\Downloads\raw-20221121T200702Z-001.zip' -Recurse -Filter *.raw |
    Sort-Object CreationTime | Copy-Item -Destination {
        'F:\Downloads\raw-20221121T200702Z-001.zip/test/IMG_001_{0:D4}.jpg' -f
            $count['Value']++
    }

用于格式字符串可确保整数用 4 位数字表示。有关详细信息,请参阅自定义数字格式字符串D4

正如你所注意到的,它不是用于枚举每个文件,而是使用延迟绑定脚本块来生成目标文件的新名称,并且每个源对象都从管道绑定。ForEach-Object

值得注意的是,正斜杠可能会带来问题,可能应该改为反斜杠:。/test/\test\

1赞 Ralph Sch 11/22/2022 #2

你不需要一个哈希表来迭代......只需使用 .[int]

为了清楚起见,请不要在此处使用容易被误认为是文件而不是目录名称的路径。

Get-Childitem 不适用于文件,如果可以,则不可移植。

此外,-Destination 的脚本块不太可能起作用,因为在其外部定义的参数在内部不可用。也没有必要拖延任何事情。

像这样的东西应该就足够了:

$ziproot ='F:\input_folder'
$count = 0
$candidates = Get-ChildItem  -Recurse -Filter '*.raw' |
Sort-Object CreationTime

ForEach($file in $candidates)
{
copy-item -source $_.FullName -Destination ('{0}/test/IMG_001_{1:D4}{2}' -f $ziproot,++$count, $_.Extension )
}

(尽量使用,它比 foreach-object 快约 10 倍。foreach($var in $list) {commands}