Powershell - 如何复制和重命名与正则表达式匹配的文件并将它们放入父文件夹中?

问题描述 投票:0回答:1

我正在尝试复制、重命名文件,并将复制的文件放入父文件夹中。

这行代码在当前文件夹内工作(文件被复制,用当前文件夹名称重命名,并放置在父文件夹中):

Get-ChildItem *.jpg | Where-Object Name -match '^.*6[0-9][0-9].*$' | Copy-Item -Destination { $_.Directory.parent.FullName+"\"+$_.Directory.Name+".jpg" }

但我想在父文件夹中运行它并在其所有子文件夹中运行代码。

我正在尝试创建一个像这样的嵌套循环:

Get-ChildItem -Path "D:\principal\where\contains\all\folders" -Directory -PipelineVariable Directory | ForEach-Object {
    Write-Information -MessageData "Starting on folder $($Directory.Name)" -InformationAction Continue
    Get-ChildItem -Path $Directory.FullName -Recurse -Force -Filter *.jpg | Where-Object Name -match '^.*6[0-9][0-9].*$' | ForEach-Object {
        Write-Information -MessageData "Processing file $($_.Name)" -InformationAction Continue
        Copy-Item -Destination { $_.Directory.parent.FullName+"\"+$_.Directory.Name+".jpg" }
    }
    Write-Information -MessageData "Finished with folder $($Directory.Name)" -InformationAction Continue
}

但是不起作用。

powershell file-manager
1个回答
0
投票

我认为你使这项任务过于复杂化了。基本上,您将参数

-Recurse
添加到第一个代码片段中,就完成了。 但由于您使用目录名称来重命名文件,因此每个文件夹只能重命名/复制一个文件。 🤷🏼u200d♂️ ...如果您有多个具有相同名称的文件夹(例如子文件夹),这将是另一个限制。

Get-ChildItem -Filter *.jpg -File -Recurse | 
    Where-Object -Property Name -match -Value '^.*6[0-9][0-9].*$' | 
        Copy-Item -Destination { $_.Directory.parent.FullName + "\" + $_.Directory.Name + ".jpg" }

您可以在任何文件夹中运行此代码,它将处理所有子文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.