希望有人能帮我。我需要定期清理一些数据,但除了手动清理之外,我还没有想出一个好的解决方案。
这是我手动经历的流程。
我有一个名为“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 $true
在if
语句中。
cp
是内置别名Copy-Item
Remove-Variable
被省略了。(不过,如果你愿意,你也可以使用内置别名rv
。)