powershell 查找具有特定扩展名的所有文件,按创建时间排序并使用新名称复制

dojqjjoe  于 2022-12-18  发布在  Shell
关注(0)|答案(2)|浏览(166)

我尝试递归查找扩展名为.raw的所有文件,然后按照CreationTime的升序对它们进行排序。我想将每个文件复制到一个新目录,其中文件名为IMG_001_0001.jpg ..IMG_001_0099.jpg,我使用4位数字按升序排列。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}
insrf1ej

insrf1ej1#

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

$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']++
    }

使用D4作为格式字符串可以确保整数用4位数表示。有关详细信息,请参阅Custom numeric format strings
正如您所注意到的,这里没有使用ForEach-Object枚举每个文件,而是使用延迟绑定脚本块为目标文件生成新名称,并且每个源对象都是从管道绑定的。
值得注意的是,/test/中的正斜杠可能会带来问题,可能应该改为反斜杠:\test\ .

y4ekin9u

y4ekin9u2#

你不需要哈希表来迭代.... a.只需要使用[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 )
}

(Try如果可能,使用foreach($var in $list) {commands},它比foreach-object快大约10倍。)

相关问题