根据扩展名将重命名的文件移动到文件夹中

根据扩展名将重命名的文件移动到文件夹中

Windows 10系统——Powershell工具。

我的电脑上有 5 个文件夹,每个文件夹包含 2 个子文件夹,分别名为 images 和 json,每个 images 子文件夹包含 3 个 png 文件,编号分别为 1.png、2.png 和 3.png。json 子文件夹具有相同的结构,每个子文件夹包含 3 个文件,分别为 1.json、2.json 和 3.json。

我运行命令按照正常工作的单个序列重命名这些文件,也就是说,在所有 png 子文件夹中,png 都是按顺序排列的,json 也是如此。

eg.
       Folder 1\Images\ 1.png, 2.png, 3.png
       Folder 2\Images\ 4.png, 5.png, 6.png

还有 json

eg.
       Folder 1\json\ 1.json, 2.json, 3.json
       Folder 2\json\ 4.json, 5.json, 6.json

请参见下面该命令的结果。

'D:\Files_png_json\' | ForEach-Object{$($_ + "\*.png"), $($_ + "\*.json")} | Get-ChildItem -Recurse | foreach { If ( $_.extension -ne $prevExt ) { $i=1 } Rename-Item $_.FullName -NewName ('{0}' -f $i++ +$_.extension); $prevExt = $_.extension; }

不带 Copy-Item 的输出命令:

PS C:\WINDOWS\system32> 
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 1\Images\1.png Destination: D:\Files_png_json\Folder 1\Images\1.png".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 1\Images\2.png Destination: D:\Files_png_json\Folder 1\Images\2.png".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 1\Images\3.png Destination: D:\Files_png_json\Folder 1\Images\3.png".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 2\Images\1.png Destination: D:\Files_png_json\Folder 2\Images\4.png".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 2\Images\2.png Destination: D:\Files_png_json\Folder 2\Images\5.png".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 2\Images\3.png Destination: D:\Files_png_json\Folder 2\Images\6.png".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 1\Json\1.json Destination: D:\Files_png_json\Folder 1\Json\1.json".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 1\Json\2.json Destination: D:\Files_png_json\Folder 1\Json\2.json".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 1\Json\3.json Destination: D:\Files_png_json\Folder 1\Json\3.json".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 2\Json\1.json Destination: D:\Files_png_json\Folder 2\Json\4.json".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 2\Json\2.json Destination: D:\Files_png_json\Folder 2\Json\5.json".
What if: Performing the operation "Rename File" in destiny "Item: D:\Files_png_json\Folder 2\Json\3.json Destination: D:\Files_png_json\Folder 2\Json\6.json".

我想要的是将所有 png 文件和所有重命名的 json 文件放在它们自己的文件夹中。

eg.
       \PNG\ 1.png, 2.png, 3.png, 4.png, 5.png, 6.png
       \JSON\ 1.json, 2.json, 3.json, 4.json, 5.json, 6.json

使用相同的命令,我在行尾插入了一个 if 来检查文件扩展名,并根据扩展名将要重命名的文件复制到各自的 PNG 或 JSON 文件夹中:

$pathPNG = "D:\JSON"
$pathJSON = "D:\PNG"
$prevExt = ""
'D:\Files_png_json\' | ForEach-Object{$($_ + "\*.png"), $($_ + "\*.json")} | Get-ChildItem -Recurse | foreach { If ( $_.extension -ne $prevExt -or $prevExt -eq $null ) { $i=1 } Rename-Item $_.FullName -NewName ('{0}' -f $i++ +$_.extension); If ( $_.extension -eq ".png" ) {Copy-Item $_.FullName -Destination $pathJSON -Force }else {Copy-Item $_.FullName -Destination $pathPNG -Force}; $prevExt = $_.extension; }

但是现在,当将文件复制到其他文件夹并读取重命名的文件时,它会显示无法复制该文件的消息,因为它不存在?!...但是如果文件夹包含一个文件,无论名称如何,为什么它会显示无法复制该文件的消息,因为它不存在?

输出改变的命令:

Copy-Item : Copy-Item : Unable to find the path 'D:\Files_png_json\Folder 2\Images\1.png' because it doesn't exist.
No line:1 character:251
+ ... sion -eq ".png" ) {Copy-Item $_.FullName -Destination $pathJSON -Force }else { ...
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\Files_png_json\Folder 2\Images\1.png:String) [Copy-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand 'D:\Files_png_json\Pasta 2\Images\1.png' because it doesn't exist.
No line:1 character:251
+ ... sion -eq ".png" ) {Copy-Item $_.FullName -Destination $pathJSON -Force }else { ...
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\Files_png_json\Folder 2\Images\1.png:String) [Copy-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand
+ CategoryInfo          : ObjectNotFound: (D:\Files_png_json\Folder 2\Images\1.png:String) [Copy-Item], ItemNotFoundException

这个说找不到的文件,是在Copy-Item之前在命令块中重命名的文件,重命名后的值是4.png而不是1.png。

看起来复制项仍在寻找重命名前的文件名而不是新名称!

注意:这仅发生在重命名的文件中,未重命名的文件可以正常复制!

一个不知道有没有帮助的细节:

在命令中If ( $_.extension -eq ".png" ),正在true value移动 JSON 文件,并且false value正在移动 PNG 文件。

因此,我将 JSON 文件夹放在 中true value,将 PNG 文件夹放在 中false value

但是逻辑难道不是真值移动 PNG 文件而假值移动 JSON 文件吗?

不起作用:
上述命令仅重命名并同时访问同一文件夹中的文件。

有效的命令:
重命名并将所有文件一起复制到另一个文件夹:

$fileRenamed = "C:\MyRenamedPngJsonFolder\"
foreach ($e in $("png","json")) {ls 'C:\MyOriginalPngJsonFolder' -r -filt *.$e | % {$i=1} { copy $_.FullName $("$fileRenamed"+$i+"."+$e) -Recurse; $i++}}

文件将在输出文件夹中重命名,如下所示:

1.json 1.png, 2.json 2.png, 3.json 3.png, 4.json 4.png, 5.json 5.png...

注意:您可以在计算机的任何位置创建重命名文件的文件夹。源文件夹中的文件不会被重命名。

@jfrmilner 感谢您对此命令的帮助。

答案1

这是一种简化的方法,将代码分成多行以便于阅读

$pathPNG = "D:\PNG"
$filesPng = Get-ChildItem -Path 'D:\Files_png_json\' -Recurse -File -Filter *.png
$filesPng | ForEach-Object -Begin {$i=1} -Process { Copy-Item -Path $_.FullName -Destination $($pathPNG + $i + '.png') -Verbose ; $i++ }

$pathJSON = "D:\JSON"
$filesJson = Get-ChildItem -Path 'D:\Files_png_json\' -Recurse -File -Filter *.json
$filesJson | ForEach-Object -Begin {$i=1} -Process { Copy-Item -Path $_.FullName -Destination $($pathJSON + $i + '.json') -Verbose ; $i++ }

应原始发帖者要求,以上内容仅供参考

foreach ($e in $("png","json")) {ls 'D:\Files_png_json' -r -filt *.$e | % {$i=1} { copy $_.FullName $("D:\"+$e+"\"+$i+"."+$e);$i++}}

相关内容