提问人:Marcos Camargo 提问时间:11/22/2022 最后编辑:ItchydonMarcos Camargo 更新时间:12/1/2022 访问量:372
查找具有特定扩展名的所有文件,按创建时间对它们进行排序,然后使用新名称复制它们
Find all files with a particular extension, sorting them by creation time and copy them with a new name
问:
我试图递归地查找扩展名为 .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}
答:
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}
评论