脚本扫描多个目录,查找文件并将其复制到新名称

脚本扫描多个目录,查找文件并将其复制到新名称

希望有人能帮我。我需要定期清理一些数据,但除了手动清理之外,我还没有想出一个好的解决方案。

这是我手动经历的流程。

我有一个名为“Data”的顶层文件夹,其下有多个文件夹,大约 100 个。每个文件夹下都有一个名为 folder.jpg 的文件。此目录下还有子文件夹,但我需要它停留在根目录。

理想情况下,它会搜索每个文件夹,看看其中是否有一个名为 show.jpg 的文件,如果有,则忽略该文件夹并继续。如果没有,则在同一文件夹中查找名为 folder.jpg 的文件,并将其复制到名为 show.jpg 的新文件中。

在我看来这听起来很简单。

答案1

这是一个可以在 PowerShell 中运行的脚本,但我还没有进行测试。假设您的 Data 文件夹位于 C: 的根目录中。

Get-ChildItem C:\Data\*\* | Where-Object {$_.Name -eq 'folder.jpg'} | ForEach-Object {
    $CurrentFolder = $_.Directory
    if ((Test-Path "$CurrentFolder\show.jpg") -eq $false)
    {Copy-Item $_ "$CurrentFolder\show.jpg"}
    Remove-Variable CurrentFolder
}

分解:

给出的参数Get-ChildItem告诉它返回与 C:\Data 相隔一个文件夹级别的所有对象。

Where-Object用于将这些结果过滤为仅名为 folder.jpg 的文件。

ForEach-Object用于循环遍历剩余的结果。

为了处理每个 folder.jpg,我们首先设置一个变量($CurrentFolder)来包含其文件夹路径的值。

然后我们用它Test-Path来查看同一文件夹中是否缺少 show.jpg。

如果找不到show.jpg,Copy-Item将复制folder.jpg到show.jpg。

清理$CurrentFolder变量Remove-Variable是严格可选的,但却是很好的做法。

如果您正在寻找“一行”代码,那么脚本也可能被缩减为这样:

ls C:\Data\*\*|?{$_.Name -eq 'folder.jpg'}|%{$c=$_.Directory;if(!(Test-Path "$c\show.jpg")){cp $_ "$c\show.jpg"}}

ls是内置别名Get-ChildItem

?是内置别名Where-Object

%是内置别名ForEach-Object

$CurrentFolder缩短为$c

通过将 的结果封装在 中, 的结果Test-Path "$c\show.jpg"被否定(即:TRUE 将为 FALSE,反之亦然)。!()如果表达式直接计算为布尔值,并且您希望代码块在 TRUE 上运行,则无需包含-eq $trueif语句中。

cp是内置别名Copy-Item

Remove-Variable被省略了。(不过,如果你愿意,你也可以使用内置别名rv。)

相关内容