gpt4 book ai didi

Powershell脚本删除不在带有进度条的列表中的文件

转载 作者:行者123 更新时间:2023-12-03 00:35:21 27 4
gpt4 key购买 nike

我有一个包含 .jpg 文件的文件夹。我将这些与访问数据库中的产品相关联。产品来源之一提供了这些 .jpg 文件,但它们不允许您轻松地仅下载当前使用的图片。因此,我找到了一个 PowerShell 脚本来删除我不需要的文件。

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt
dir -rec M:\PhotoDirectory\PhotoFolder | Where-Object {$exclusions -notcontains $_.name } | Remove-Item

感谢@x0n Powershell script to delete files not specified in a list

而且效果很好!但问题是它需要很长时间,而且我有超过 180,000 个项目要搜索和删除。所以我想制作一个进度条,让我知道我完成了这个过程有多远。

所以经过一番搜索,我找到了一篇名为“使用进度条”的文章

问题是我不知道如何将两者混合在一起,但是我在这里尝试过:

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt 
1..100 | foreach-object {
Write-Progress -Activity "Deleting Files" -Status "$_ %" -Id 1 -PercentComplete $_ -CurrentOperation "Deleting File $_"
dir -rec M:\PhotoDirectory\PhotoFolder | Where-Object {$exclusions -notcontains $_.name } | Remove-Item
}

然而,这似乎比原始脚本花费的时间更长,我不知道它到底是如何工作的,我正在测试它,我只需要删除 10-15 个文件。

很可能我缺少一些非常基本的东西,但我真的很感激能帮助我理解这一点。

这里我添加了一个截图:

PowerShell Console

最佳答案

However that seems to take even longer than the original script did

那是因为您正在尝试枚举、过滤和删除文件 100 次——这显然是不必要的。

您要做的是计算您在删除文件的过程中进行了多长时间,然后将其用作传递给 Write-Progress 的百分比的基础。保持计数的最简单方法可能是使用常规的 for 循环:

注意:前两个示例非常通用,请转到底部查看将您的容量(~180.000 个文件)考虑在内的示例。

# Grab all the files you need to delete
$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt
$filesToDelete = Get-ChildItem M:\PhotoDirectory\PhotoFolder -Recurse | Where-Object {$exclusions -notcontains $_.Name }

for($i = 0; $i -lt $filesToDelete.Count; $i++){
# calculate progress percentage
$percentage = ($i + 1) / $filesToDelete.Count * 100
Write-Progress -Activity "Deleting Files" -Status "Deleting File #$($i+1)/$($filesToDelete.Count)" -PercentComplete $percentage
# delete file
$filesToDelete[$i] |Remove-Item
}
# All done
Write-Progress -Activity "Deleting Files" -Completed

您可能想用来表示百分比的另一个特征是删除的相对体积(总字节数)。我们可以通过简单地跟踪总共需要删除多少字节,以及到目前为止我们已经删除了多少字节来做到这一点:

$exclusions = Get-Content C:\Users\office\Desktop\ExcludedPhotos.txt
$filesToDelete = Get-ChildItem M:\PhotoDirectory\PhotoFolder -Recurse | Where-Object {$exclusions -notcontains $_.Name }
$TotalSize = ($filesToDelete |Measure-Object -Property Length -Sum).Sum
$BytesRemoved = 0

foreach($file in $filesToDelete){
$percentage = $BytesRemoved / $TotalSize * 100
Write-Progress -Activity "Deleting Files" -Status "Deleted $BytesRemoved/$TotalSize bytes" -PercentComplete $percentage
$file |Remove-Item
$BytesRemoved += $file.Length
}
Write-Progress -Activity "Deleting Files" -Completed

正如@MatthewWetmore 指出的那样,每次删除文件时调用Write-Progress 当然会产生一些开销。对于 180.000 个文件,当进度从 3.56325% 变为 3.56331% 时,您可能对 UI 更新不感兴趣

您可以做的是使用 for 循环以整个项目集的 1% 为增量进行计数,然后在每次迭代中删除整个范围内的文件:

[int]$hundredthStep = $filesToDelete.Count / 100
for($i = 0; $i -lt $filesToDelete.Count; $i += $hundredthStep){
# calculate progress percentage
$percentage = ($i + 1) / $filesToDelete.Count * 100
Write-Progress -Activity "Deleting Files" -Status "Deleting File up to #$($i+1)/$($filesToDelete.Count)" -PercentComplete $percentage
# delete file
$filesToDelete[$i..($i + $hundredthStep - 1)] |Remove-Item
}
# All done
Write-Progress -Activity "Deleting Files" -Completed

关于Powershell脚本删除不在带有进度条的列表中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com